在 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