猫の魔法

主にruby系の技術メモを記載

brewコマンドをrakeタスクの中から呼ぶ方法

Rakefileを使ってbrewコマンドラインから叩いて実行するスクリプトを作っていたのだが、エラーが出て上手く行かなかった。 ネットを結構探したが、解決策がなかなか見つからなかったのでここに顛末を残しておく。

経緯

Rakefileを作って、その中からshでbrewを読んでみた所、以下のエラーが出てうまく動作しなかった。 なお、bundle execしているのはGemfileを使っている為。

Rakefile

require 'pry'

task zsh_install do
  sh(`brew install zsh`)
end

実行コマンド

$ bundle exec rake zsh_install

エラー

Could not find rake-12.1.0 in any of the sources
Run `bundle install` to install missing gems.

エラーに書いてある通り、bundle installしたり、環境変数をいじってみたりしたがどうにも上手く行かなかった。
とりあえずrequire 'pry'を一時的に消して、bundle execを外して実行して見たところ、上手く動く事が判明した。

結論

で、なんでという話になるのだが、bundelrのdocページにHomebrewをbundleで実行するスクリプトの中から叩く場合はBunder.with_clean_envのブロック内でやれよ的な事が書いてあった。 つまりbundler対応させるのであれば、やり方が違うという話のようだ。

念の為、ソースを見て裏を取っていたら、どうやらwith_clean_envが使っているclean_envはdeprecatedで、 代わりにoriginal_env使ってね的な事が書いてあったので、 以下のようにソースを修正して上手く動く事を確認した。

require 'pry'

task zsh_install do
  Bundler.with_original_env do
    sh(`brew install zsh`)
  end
end
 

with_clean_envとwith_original_env

bundlerの話はソースを信じて、original_envの方を使ったが bundlerのドキュメントの方はwith_clean_envを使う方法が書いてある。
また、clean_envがdeprecatedになったのは2年以上前のようでその後の進捗がないのも気になる。
PR内の話を信じるなら、bundle 2.0ではclean_envをサポートしないって言っているけど、2.0のコードを見るとまだdeprecatedで残っているので、何がホントなのかよく分からない。。。