「特定の環境変数を上書きして複数の外部コマンドを実行する」というコードを脳に優しく書けるようにするために、ブロック付きメソッドを活用して Lisp の with-* マクロのような構文をつくる。
with_env - 環境変数を上書きしてブロックを実行する
「特定の環境変数を上書きして複数の外部コマンドを実行する」用のユーティリティメソッド。ブロックの中でだけ環境変数を変更できる。
with_env.rb
def with_env(env, &block)
original_env = ENV.to_hash
ENV.update(env)
yield if block_given?
ensure
ENV.replace(original_env)
end
env = {'GEM_HOME' => nil, 'BUNDLE_GEMFILE' => nil}
with_env(env) do
system('bundle install --path=vendor/bundle')
system('bundle exec rake spec')
end
system(env, command)
としても良いのだけど、毎回同じ変数を渡すのは DRY ではないし、ブロックの中のコードを単独のメソッドに切り出したときいちいち env
を渡すのはうれしくない。影響がブロック内に限定されているほうが理解しやすい。
なお、この実装は Bundler.with_original_env を参考にした。