「bundler/inline」、rbenv、およびグローバル Ruby と組み合わせて path/gem_home を設定する
概要
スタンドアロンでポータブルな Ruby スクリプトを作成するために、私は Bundler/inline を使用しています。
このスクリプトをプロビジョニングするサーバーは非常に特殊で、rbenv (複数の Ruby バージョンをロールバック/使用できる) があり、特定の gem (バックアップ gem) のインストールにコストがかかるためです。グローバル Ruby インストールを使用します。
その結果、root 以外のユーザーが「bundle/inline」を含むスクリプトを実行すると、エラーがスローされます。
Your user account isn't allowed to install to the system Rubygems.
You can cancel this installation and run:
bundle install --path vendor/bundle
to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to Rubygems using sudo.
残念ながら、bundler/inline にはこれを引数として与えるオプションがありません。
そこで、バンドルパスを設定してこれを解決しようとしました:bundle config path ~/.gem/ruby/2.3.0/ですが、これは機能しません。 (確認したところ、設定は正しく保存されていました)
GEM_HOME=~/.gem/ruby/2.3.0/ を設定すると機能します。 (Ruby gems は、このシナリオでは 2 つの gem ホームをサポートしているため、これは実際には正常に機能します)。唯一の問題は、rbenv によってアクティブ化された Ruby のマイナー バージョンに合わせて環境変数を維持するために、何らかの記録を行う必要があることです。 Ruby スクリプトからこの ENV を設定することはできません。現在のバージョンに基づいてこのバージョンを簡単に計算できます。
version_used_for_gem_home = RUBY_VERSION.gsub /\.\d+$/, '.0'
ENV['GEM_HOME'] = "/var/lib/postgresql/.gem/ruby/#{version_used_for_gem_home}/"
require 'bundler/inline'
簿記を一切必要としない、より良い解決策はあるでしょうか?パス/gem ホームを変更するために使用できる rbenv フックがあればいいのですが…
解決策
私たちも同じ問題を抱えていましたが、これでうまくいくことがわかりました
require 'bundler/inline'
require 'bundler'
Bundler.configure # where the magic happens
# passing true here does the install; in real scripts we
# pass a boolean based on a --install flag.
gemfile(true) do
...gems go here...
end
Bundler.configure を明示的に呼び出してバンドル構成を読み取り、パスを正しく設定する必要があります。