依存関係を指定する

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/ ディレクトリにあると想定しています。

  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. 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
    
  4. プライベート パッケージのインポート方法や使用方法は変更しないでください。import ステートメントは次のようになります。

    import "private.example.com/foo"
    
  5. アプリをデプロイして、デプロイメント内にプライベート依存関係を含めます。

    gcloud app deploy