指定依赖项

在 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/ 目录中:

  1. 切换至您的应用目录:

    cd /myapp
    
  2. 创建包含专用依赖项的目录:

    mkdir private
    

    确保您的专用依赖项位于 private 目录中。一种方法是创建符号链接:

    mkdir private/private.example.com
    ln -s /path/to/private.example.com/foo private/private.example.com/foo
    
  3. 更新 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
    
  4. 请勿修改导入和使用私有软件包的方式。import 语句应如下所示:

    import "private.example.com/foo"
    
  5. 通过部署应用,在部署中包含您的专用依赖项:

    gcloud app deploy