在 Go 1.12+ 标准运行时中运行的应用可以使用任何与 linux/amd64 兼容的软件包。
App Engine 要求 Go 代码中的所有导入语句指定绝对路径。例如,使用以下命令:
import "github.com/example/mypackage"
使用 Go 模块
我们建议您使用 Go 模块来管理 Go 应用中的依赖项。如果您尚未准备好迁移到 Go 模块,则可以继续使用旧的 GOPATH 模式。
从 Go 1.22 及更高版本开始:
在旧版
GOPATH模式 (GO111MODULE=off) 下,您不能在模块外部使用go get。如需了解详情,请参阅工具。Go 建议您使用
go.mod文件来管理依赖项。 如需在部署期间安装依赖项,请将go.mod文件添加到app.yaml文件所在的文件夹中。如需详细了解 Go 版本以及如何管理供应商目录的依赖项,请参阅GOPATH和模块。
部署应用时,App Engine 会使用 go build 命令构建应用,并匹配 Go 本身的行为。如需确保应用使用 module-aware 模式,请在开发环境中执行以下操作:
在
app.yaml文件所在的目录中创建模块的go.mod文件。App Engine 会搜索当前目录和连续的父级目录,直至找到go.mod文件。如果 App Engine 未找到
go.mod文件,则会遵循GOPATH模式。如果设置
GO111MODULE环境变量,请确保变量的值可启用module-aware模式。部署应用时,App Engine 会检查环境中的GO111MODULE并匹配 Go 本身的行为。只有在为应用添加了go.mod文件的情况下,App Engine 才会应用GO111MODULE变量设置。对于 Go 1.12,请勿将应用目录放在
$GOPATH/src文件夹中。如果 Go 1.12 应用位于$GOPATH/src目录树中的任何位置,则即使您为应用定义了go.mod文件,App Engine 也会遵循GOPATH模式。对于 Go 1.13 及更高版本,App Engine 默认使用
module-aware模式,除非GO111MODULE替换默认模式或应用目录中不存在go.mod文件。
Vendoring 依赖项
Vendoring 会将您的应用使用的软件包复制到应用目录中,而不是在编译过程中从其来源下载模块。Go 提供 go build 命令,以通过 vendor 方法将应用所需的软件包添加到应用的根目录中名为 vendor 的目录。
在 Go 1.14 及更高版本中,如果应用的根目录包含名为 vendor 的目录,则 go build 命令和 App Engine 部署流程会使用 vendor 目录中的软件包,而不是下载模块。
在 Go 1.13 及更低版本中,只有在将环境设置为使用 GOPATH 模式时,vendoring 才可用。
使用专用依赖项
在构建过程中,App Engine 无法下载您的专用依赖项,因此您必须在部署时将依赖项包含在应用代码中。
您可以在 go.mod 文件中使用 replace 指令来声明专用依赖项。以下示例假定您的应用位于 /myapp/ 目录中:
切换至您的应用目录:
cd /myapp创建包含专用依赖项的目录:
mkdir private确保您的专用依赖项位于
private目录中。一种方法是创建符号链接:mkdir private/private.example.com ln -s /path/to/private.example.com/foo private/private.example.com/foo更新
go.mod文件,以使用replace指令将private目录用于您的依赖项:go mod edit -replace=private.example.com/foo=./private/private.example.com/foo您的
go.mod文件现在应如下所示:最终的
go.mod文件module private.example.com/myapp require private.example.com/foo v1.2.3 replace private.example.com/foo => ./private/private.example.com/foo原始的
go.mod文件module private.example.com/myapp require private.example.com/foo v1.2.3请勿修改导入和使用私有软件包的方式。
import语句应如下所示:import "private.example.com/foo"通过部署应用,在部署中包含您的专用依赖项:
gcloud app deploy