2016-11-28 3 views
0

私はrubyスクリプトの中でhomebrewシェルコマンドを発行しようとしています。ruby​​のkernel.system内からhomebrew

私はhomebrewシェルコマンドを正常に発行できます。たとえば、これは問題なく動作します:

$ brew list | head -n 1 
ack 

私もうまくルビーからシェルコマンドを発行できます。

$ bundle exec ruby -e "Kernel.system('echo foo')" 
foo 

私はルビーから自作のシェルコマンドを発行するときしかし、私はbundler-を取得します関連するエラー:

bundle exec ruby -e "Kernel.system('brew list')" 
Your bundle is locked to bubs (0.0.6), but that version could not be found in any of the sources listed in your Gemfile. If you haven't changed sources, that means the author of bubs (0.0.6) has removed it. You'll need to update your bundle to a different version of bubs (0.0.6) that hasn't been removed in order to install. 

これは、可能な限り小さなGemfile(これは問題ではありません)でも発生します。

source 'https://rubygems.org' 

gem 'bubs' 

ので、自作、ルビー、バンドラ、そしておそらくRVMのいくつかのサブセットは、(私のルビーは、現在インストールされている方法です)一緒にうまくプレーされていません。

なぜこのエラーが出るのか、および/または私がrubyから作業するためにhomebrewコマンドを取得する方法

+0

'brew'はRubyで書かれているが、gemsetsの競合があります。 'ruby -e 'Kernel.system(' brew list ')' 'コマンドの前で' bundle exec'を省略しても問題ありません。 – mudasobwa

+0

残念ながら、これは単なるテストケースです。実際のプロジェクトで 'bundle exec'を削除することはできません。私が構築している全体的なことは、別のツールに依存している宝石です。他のツールがインストールされていない場合は、それを 'brew install 'しようとします。私が構築している宝石は、多くの宝石のように、バンドラーを使って作られており、バンドラーを大量に使います。 gemsetの競合については、そのようなものが可能であるようです。しかし、それは実際にどのような宝石が記載されているかは重要ではないようです。例えば、私の質問にあるGemfileの例では、私がランダムに選択した単一の小さな宝石を使っています。 – Fishtoaster

+0

もう一度:これは、Rubyで書かれた 'brew'とアプリケーションとの間の**' gemset' **の競合です。もちろん、あなたの 'Gemfile'にどのような宝石がリストされているかには依存しません。現在の環境を派生していない新しいシェルなどで 'brew'を実行して遊んでみることもできます。 – mudasobwa

答えて

0

いくつかの検索の後に答えを見つけました:あなたはBundler.with_clean_envのバンドルラーで砲撃を包んでください。例:bundle exec ruby -e "Bundler.with_clean_env { Kernel.system('brew list') }"が動作します。

Bundlerには、Bundler.clean_system('brew list')のようなショートカットがあります。ドキュメントから

http://bundler.io/v1.13/man/bundle-exec.1.html#Shelling-out

関連する問題