LoginSignup
8
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 を参考にした。

8
8
0

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
  3. You can use dark theme
What you can do with signing up
8
8