Go 1.12 以降のスタンダード ランタイムで動作するアプリでは、任意の linux / amd64 互換パッケージを使用できます。
App Engine では、Go コード内のすべての imporet ステートメントに絶対パスを指定する必要があります。たとえば、次のように使用します。
import "github.com/example/mypackage"
Go モジュールを使用する
Go アプリの依存関係を管理するには、Go モジュールを使用することをおすすめします。Go モジュールに移行する準備ができていない場合は、以前の GOPATH
モードを引き続き使用できます。
Go バージョン 1.22 以降では:
以前の
GOPATH
モード(GO111MODULE
=off
)のモジュール外でgo get
を使用することはできません。詳細については、ツールをご覧ください。Go では、依存関係の管理に
go.mod
ファイルを使用することをおすすめしています。デプロイ中に依存関係をインストールするには、app.yaml
ファイルと同じフォルダにgo.mod
ファイルを含めます。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 自体の動作に合わせます。App Engine は、アプリにgo.mod
ファイルが含まれている場合にのみ、GO111MODULE
変数の設定を適用します。Go 1.12 では、
$GOPATH/src
フォルダ内にアプリのディレクトリを置かないでください。Go 1.12 アプリが$GOPATH/src
ディレクトリ ツリー内のどこかにある場合、アプリにgo.mod
ファイルを定義している場合でも、App Engine はGOPATH
モードに従います。Go 1.13 以降では、
GO111MODULE
がデフォルトをオーバーライドするか、アプリのディレクトリにgo.mod
ファイルが存在しない限り、App Engine はデフォルトでmodule-aware
モードを使用します。
依存関係のベンダリング
ベンダリングによって、ビルドプロセス中にソースからモジュールをダウンロードする代わりに、アプリが使用するパッケージがアプリケーションのディレクトリにコピーされます。Go には、アプリのルート ディレクトリにある vendor
という名前のディレクトリに、アプリに必要なパッケージをベンダリングするための go build
コマンドが用意されています。
Go 1.14 以降では、アプリのルート ディレクトリに vendor
という名前のディレクトリがある場合、go build
コマンドと App Engine デプロイ プロセスでは、モジュールをダウンロードする代わりに、vendor ディレクトリのパッケージを使用します。
Go 1.13 以前の場合、ベンダリングは、GOPATH
モードを使用するように環境を設定している場合にのみ利用できます。
プライベート依存関係を使用する
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
replace
ディレクティブを使用して、依存関係にprivate
ディレクトリを使用するようにgo.mod
ファイルを更新します。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