Ruby で依存関係を指定する

Ruby で作成された Cloud Functions は、bundler を使用して依存関係にアクセスします。依存関係は、関数のデプロイ時または関数とともにローカルにパッケージ化されているときにダウンロードできます。

各関数は、functions_framework gem とその関数で必要な他の gem を指定する Gemfile を提供する必要があります。Gemfile は、関数コードを含む app.rb ファイルと同じディレクトリに置く必要があります。さらに、関数はすべての一時的な依存関係と正確なバージョンを指定するロックファイルを提供する必要があります。このファイル(Gemfile.lock)も Gemfile と同じディレクトリにあります。

関数をデプロイすると、Cloud Functions は bundler を使用して、GemfileGemfile.lock で宣言された依存関係をダウンロードしてインストールします。

Gemfile には、関数に必要なパッケージとオプションのバージョンの制約が列挙されます。詳細については、Gemfile リファレンスをご覧ください。

次に Gemfile の例を示します。

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"
gem "google-cloud-storage", "~> 1.29"

functions_framework gem とその他の依存関係は、次のコマンドを実行してインストールします。

bundle install

bundler は、依存関係を分析する際に Gemfile.lock を生成し、インストールする各 gem の一致するバージョンをフリーズします。これにより、たとえば、ローカルテストで使用されているものと同じ依存関係のバージョンで関数がデプロイされます。Gemfile.lock の正確な形式は bundler 専用であり、手動で編集することはできません。

前に bundler を使用して依存関係をインストールし、ローカルでテストを実行している場合は、おそらく Gemfile.lock ファイルはすでに存在しています。ロックファイルがない場合は、次のコマンドを実行して生成できます。

bundle lock

Functions Framework は、すべての関数に必須の依存関係です。Cloud Functions は、関数の作成時にユーザーの代理でこの依存関係をインストールしますが、明確化のため明示的な依存関係として含めておくことをおすすめします。

関数がプライベート依存関係を利用している場合は、functions-framework をプライベート レジストリにミラーリングすることをおすすめします。ミラーリング対象の functions-framework を依存関係として関数に含めることで、公共のインターネットからパッケージがインストールされないようにします。

ローカル依存関係をパッケージ化する

依存関係と関数は、一緒にパッケージ化してデプロイすることもできます。この方法は、依存関係が rubygems パッケージ マネージャーを介して使用できない場合に選択できます。

ローカルで gem をパッケージ化するには、関数のディレクトリ構造内のディレクトリに gem を入れ、そのパスを依存関係の Gemfile エントリに記述します。gem のディレクトリには有効な gemspec ファイルが入っている必要があります。また、コードが関数と一緒にデプロイされるように、関数のディレクトリ階層内に配置されている必要があります。たとえば、次のようなディレクトリ構造を使用するとします。

myfunction/
├── Gemfile
├── Gemfile.lock
├── app.rb
└── my_private_gem/
    ├── lib/
    |   └── my_private_gem.rb
    └── my_private_gem.gemspec

Gemfile エントリは次のようになります。

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"
gem "my_private_gem", path: "./my_private_gem"

ローカルの gem パスの参照については、Gemfile リファレンスをご覧ください。