$GOPATH/go.mod存在,但不应在AWS Elastic Beanstalk中
我正在尝试使用bitbucket管道和AWS Elastic Beanstalk部署一个基于gin框架的golang应用程序。我创建了我的package application.zip,其中包含在EB中部署应用程序所需的所有文件,当我通过管道或AWS控制台中的手动菜单推送应用程序时,我得到了以下信息:$GOPATH/go.mod存在,但不应在AWS Elastic Beanstalk中,go,bitbucket,amazon-elastic-beanstalk,go-modules,Go,Bitbucket,Amazon Elastic Beanstalk,Go Modules,我正在尝试使用bitbucket管道和AWS Elastic Beanstalk部署一个基于gin框架的golang应用程序。我创建了我的package 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 |
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的简单应用程序,它基本上是一个restapi服务器。
我的项目结构如下:
#!/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"
/go/src/company.com/project
我在里面有这些文件和文件夹:
application.go
go.mod
Controller/dashboardController.go
Model/user.go
Service/utility.go
BuildFile
Procfile
最后两个文件用于让EB在S3中上传后构建项目。
当然,本地的一切都很好,以及我第一次上传包含go.mod的完整项目时,请参阅第二组日志。但当我修改一个文件,再次打包应用程序并通过bitbucket piple或aws控制台将其发送给EB时,没关系,我得到了错误
解决方案
经过多次尝试后,我决定通过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 get的作用是创建./src/golang.org/x/vgo,然后副本创建./go.mod,这样看起来GOPATH下载的源代码就存在于模块中。这反过来又使它看起来像src/golang.org/x/vgo是您正在处理的项目的一部分,而vgo对其自身(不受支持的)使用vendoring感到非常困惑 原始帖子参考:
附加源:当设置了
GOPATH
时go-get
将请求的模块安装到GOPATH
中提供的路径,但如果使用.mod
文件,它将使用工作目录
在您的案例中,您设置了GOPATH
和.mod
文件
您可以unset
GOPATH,如下所示:
unset GOPATH
它应该能解决你的问题。或者,您也可以删除
.mod
文件。$GOPATH/go.mod
不应该存在,事实上,在GOPATH
的顶层应该没有文件。你到底想做什么?请提供一个,而不仅仅是一些日志输出。