在 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