【问题标题】:$GOPATH/go.mod exists but should not in AWS Elastic Beanstalk$GOPATH/go.mod 存在但不应该在 AWS Elastic Beanstalk 中
【发布时间】:2019-12-02 17:42:22
【问题描述】:

我正在尝试使用 bitbucket 管道和 AWS Elastic Beanstalk 部署基于 gin 框架的 golang 应用程序。我创建了我的包 application.zip,其中包含在 EB 中部署应用程序所需的所有文件,当我通过管道或 AWS 控制台中的手动菜单推送它时,我得到了这些:

17:21:49 make.1 | go: finding github.com/appleboy/gin-jwt v2.5.0+incompatible
  17:21:49 make.1 | go: downloading github.com/appleboy/gin-jwt v2.5.0+incompatible
  17:21:49 make.1 | go: extracting github.com/appleboy/gin-jwt v2.5.0+incompatible
  17:21:50 make.1 | go: finding gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:21:50 make.1 | go: downloading gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:21:50 make.1 | go: extracting gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:21:50 make.1 | + GOOS=linux
  17:21:50 make.1 | + GOARCH=amd64
  17:21:50 make.1 | + go build -o bin/application '-ldflags=-s -w'
  17:21:50 make.1 | go: cannot find main module; see 'go help modules'
  17:21:50 make.1 | exited with code 1
  17:21:50 system | sending SIGTERM to all processes

我发现我忘记了 go.mod 文件,确实添加了它,然后我收到了这些消息,一切正常:

  17:27:59 make.1 | go: extracting github.com/appleboy/gin-jwt v2.5.0+incompatible
  17:27:59 make.1 | go: downloading gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:27:59 make.1 | go: extracting gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:27:59 make.1 | go: finding gopkg.in/dgrijalva/jwt-go.v3 v3.2.0
  17:27:59 make.1 | + GOOS=linux
  17:27:59 make.1 | + GOARCH=amd64
  17:27:59 make.1 | + go build -o bin/application '-ldflags=-s -w'
  17:27:59 make.1 | go: downloading golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
  17:28:00 make.1 | go: extracting golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
  17:28:00 make.1 | go: finding golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
  17:28:01 make.1 | exited with code 0
  17:28:01 system | sending SIGTERM to all processes

但是在工作时我对代码进行了一些更改,然后我再次提交,认为现在一切都很好,但我得到了这些日志行:

  Executing: HOME=/tmp /opt/elasticbeanstalk/lib/ruby/bin/ruby /opt/elasticbeanstalk/lib/ruby/bin/foreman start --procfile /tmp/d20191202-5748-15rj5l8/eb-buildtask-0 --root /var/app/staging --env /var/elasticbeanstalk/staging/elasticbeanstalk.env
  17:32:00 make.1 | started with pid 5761
  17:32:00 make.1 | + go get github.com/gin-gonic/gin
  17:32:00 make.1 | $GOPATH/go.mod exists but should not
  17:32:00 make.1 | exited with code 1
  17:32:00 system | sending SIGTERM to all processes

现在我对 $GOPATH/go.mod 存在但不应该感到迷茫我使用的是最后一个 Go 版本 1.13.4,而 AWS 使用的是 1.13.2。

更多信息

我会尽量更准确地了解该项目,如果日志不够,请见谅。 我有一个带有 gorm + gin 的简单应用程序,它基本上是一个 REST API 服务器。 我的项目结构是这样的:

/go/src/company.com/project

里面有这些文件和文件夹:

application.go
go.mod
Controller/dashboardController.go
Model/user.go
Service/utility.go
BuildFile
Procfile

最后两个文件用于让 EB 在 S3 中上传后构建项目。 当然,在本地一切正常,以及我第一次上传包含 go.mod 的完整项目时,请参阅第二组日志。但是当我修改一个文件时,我再次打包应用程序并将其发送到 EB,无论是通过 bitbucket piple 还是 aws 控制台,都没有关系,我得到了错误。

解决方案

经过一番头疼后,我决定通过 ssh 登录 ElasticBeanstalk,我发现如果我将以下行添加到我的 build.sh 脚本中,那么所有问题都会消失:

sudo rm /var/app/current/go.*

我的 build.sh 文件最后是这样的:

#!/usr/bin/env bash
# Stops the process if something fails
set -xe
touch /var/app/current/go.bak
sudo rm /var/app/current/go.*

# get all of the dependencies needed
go get "github.com/gin-gonic/gin"
go get "github.com/jinzhu/gorm"
go get "github.com/jinzhu/gorm/dialects/postgres"
go get "github.com/appleboy/gin-jwt"

# create the application binary that eb uses
GOOS=linux GOARCH=amd64 go build -o bin/application -ldflags="-s -w"

【问题讨论】:

  • $GOPATH/go.mod 应该不存在,实际上GOPATH 的顶层应该没有文件。你到底想做什么?请提供minimal reproducible example,而不仅仅是一些日志输出。
  • 我在Dockerfile 中的WORKDIR /app 之前有RUN go mod download 有这样的消息。移动 WORKDIR /app 修复了该错误。

标签: go bitbucket amazon-elastic-beanstalk go-modules


【解决方案1】:

GOPATH 设置时go get 将请求的模块安装到GOPATH 中提供的路径,但如果您使用.mod 文件,它使用工作目录。

您的情况,您同时设置了GOPATH 并拥有.mod 文件。

你可以unsetGOPATH 喜欢:

unset GOPATH

它应该可以解决您的问题。或者,您也可以删除.mod 文件。

【讨论】:

    【解决方案2】:

    也许这可以帮助你。

    看起来你有 GOPATH=。并且您正在将模块复制到同一个地方。 go get 的效果是创建 ./src/golang.org/x/vgo,然后 COPY 创建 ./go.mod,这样看起来 GOPATH 的下载源就在模块中。这反过来又使它看起来像 src/golang.org/x/vgo 是您正在从事的项目的一部分,并且 vgo 对自己(不受支持的)使用 vendoring 感到非常困惑。

    原帖参考:here

    其他来源: here

    【讨论】:

    • 没错,如果定义的 GOPATH 与项目文件夹相同并且您没有定义 bin 和 src 目录,也会发生这种情况
    【解决方案3】:

    您必须删除位于 GOPATH 目录位置的 go.mod 文件

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,我所做的是:

      go env -u GOPATH
      

      如果您曾经像这样设置 GOPATH 变量 go env -w GOPATH=some_path 应该可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-15
        • 2011-08-03
        • 2017-04-01
        • 2016-07-30
        • 2015-09-26
        • 2023-04-06
        • 2016-02-22
        • 2015-05-26
        相关资源
        最近更新 更多