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で残っているので、何がホントなのかよく分からない。。。