LoginSignup
8

More than 5 years have passed since last update.

ブロック付きメソッドで with-* マクロっぽい構文をつくる

Posted at

「特定の環境変数を上書きして複数の外部コマンドを実行する」というコードを脳に優しく書けるようにするために、ブロック付きメソッドを活用して 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 を参考にした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8