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/fooreplaceディレクティブを使用して、依存関係にprivateディレクトリを使用するようにgo.modファイルを更新します。go mod edit -replace=private.example.com/foo=./private/private.example.com/foogo.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