Go での依存関係の指定

Go の Cloud Functions では、go.mod ファイルを含む Go モジュール、または vendor ディレクトリのいずれかによって、すべての依存関係を指定する必要があります。Go モジュールと vendor ディレクトリの両方を同時に使用して依存関係を指定することはできません。

Go ランタイムでは、実行環境に多数のシステム パッケージが含まれています。リストされていないシステム パッケージが必要な依存関係が関数で使用されている場合は、パッケージをリクエストできます。

このドキュメントの内容は、Go 1.11 と Go 1.13 の両方に適用されます。

Go モジュールを使用する

Cloud Functions は、Go のモジュール機能の実験的サポートに対応しており、これにより、プロジェクトのルートにある go.mod ファイルで依存関係を指定できます。関数をデプロイすると、go.mod ファイルに指定されている依存関係が自動的に取得されてビルドされます。

Go モジュールの動作は、GOPATH の内外のどちらで開発しているかによって異なります。GOPATH の内側かどうかを判断するには、次の操作を行います。

  1. プロジェクト ディレクトリに移動します。

  2. 次のコマンドを実行して GOPATH を見つけます。

    go env GOPATH
    

    次のような行が出力されます。

    GOPATH=YOUR_GOPATH
    
  3. 次のコマンドを実行して現在の作業ディレクトリを表示します。

    pwd
    

作業ディレクトリが YOUR_GOPATH で始まっていれば、GOPATH の内側です。この場合、次の 3 つのコマンドを実行して go.mod ファイルを生成します。

export GO111MODULE=on
go mod init
go mod tidy

作業ディレクトリが YOUR_GOPATH で始まっていなければ、GOPATH の外側です。この場合、次のコマンドを実行して go.mod ファイルを生成します。

go mod init MODULE
go mod tidy

上記の例では MODULE がモジュールの名前です。たとえば、example.com/myproject はモジュール名の一例です(ドメイン名は必須)。GOPATH の内側の場合、go コマンドがモジュール名を自動的に検出します。

go.mod ファイルを作成したら、go get コマンドで依存関係を取得してプロジェクトに自動的に追加できるようになります。例:

go get DEPENDENCY

上記の例では、DEPENDENCY が関数に追加する依存関係です。たとえば、コマンド go get cloud.google.com/go/storage は Cloud Storage クライアント ライブラリを関数に追加します。

vendor ディレクトリを使用する

Cloud Functions では、vendor ディレクトリを介して依存関係を含めることもできます。多くの場合、vendor ディレクトリは依存関係マネージャーを使用して管理します。依存関係マネージャーは、任意のものを使用できます。たとえば、Go のモジュール機能を使用して、go.mod ファイルから vendor ディレクトリを作成できます。

vendor ディレクトリは、依存関係マネージャーを使用して依存関係を利用できない場合や、Cloud Functions 環境のインターネット アクセスが制限されている場合に役立ちます。

使用している Go のバージョンによっては、vendor ディレクトリの設定後、その内容が適用されるように追加の手順が必要になることがあります。

Go バージョン 1.16 以降

Go 1.16 以降を使用している場合は、vendor ディレクトリをそのままにできます。メイン モジュールにトップレベルの vendor ディレクトリが含まれ、その go.mod ファイルで Go 1.16 以降が指定されている場合、そのフラグを受け入れる操作では go コマンドのデフォルトが -mod=vendor となります。

Go バージョン 1.16 より前

1.16 より前のバージョンの Go を使用している場合は、vendor ディレクトリの内容を維持するために、次の操作を行う必要があります。

バージョン 1.16 より前の Go で、go.mod ファイルと vendor ディレクトリがある場合は、関数のデプロイ時に vendor ディレクトリが無視されます。.gcloudignore ファイルを使用すると、go.mod ファイルと go.sum ファイルのアップロードを回避できます。

  1. プロジェクト ディレクトリのルートに次の内容の .gcloudignore ファイルを作成します。

    go.mod
    go.sum
    
    # Also ignore Git directories. Delete the following two lines if you want to
    # upload them.
    .git
    .gitignore
    
  2. 次のコマンドを実行することで、go.mod ファイルの内容を使用して vendor ディレクトリを作成します。

    go mod vendor
    

gcloud コマンドライン ツールを使用して関数をデプロイする場合、.gcloudignore を使用すると、go.mod のアップロードを防ぐことができます。

プライベート依存関係を使用する

関数の依存関係が一般公開されていないリポジトリでホストされる場合、その関数をデプロイする前に、vendor ディレクトリを使用して依存関係を取得する必要があります。go.mod ファイルを使用する場合は、上記の手順を参照して、go.mod ファイルと vendor ディレクトリの間の競合を未然に防いでください。