go - $GOPATH/go.mod 存在但不应该在 AWS Elastic Beanstalk 中
问题描述
我正在尝试使用 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 vesion 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"
解决方案
When GOPATH
is setgo get
将请求的模块安装到提供的路径,GOPATH
但如果您使用.mod
文件,它使用工作目录。
你的情况,你已经GOPATH
设置并拥有.mod
文件。
你可以unset
像 GOPATH 一样:
unset GOPATH
它应该可以解决您的问题。或者,您也可以删除.mod
文件。
推荐阅读
- css - How create custom checkbox with background using Styled Components?
- php - PHPMailer 不发送电子邮件
- apache-kafka - 如何在 KTable 中动态查找?
- android - 运行免安装应用一次后无法安装普通应用(安装失败,原因是:'-27')
- javascript - 如何使用 java 脚本自动计算表行?
- c - 如果您创建一个打开文件的函数,这些文件会在函数返回后自动“fclose()”吗?
- python - Tkinter 变量不随函数中的 Checkbutton 改变
- javascript - 子组件 componentDidMount() 应该调用不同的方法取决于父组件
- r - R闪亮设置复选框将值控制为数据框特定列中的值
- node.js - 为什么我在使用 Express 和 React.js 时得到 401 的静态文件?