2011-12-07 7 views
12

私はWindows上で開発し、Linuxに配備しているRailsアプリケーションを持っています。私は、将来私がLinuxに全面的に切り替えると思う。とにかく、Linuxでは私は 'execjs'と 'therubyracer'が必要ですが、Win7ではそれらは必要ありません。だから、私はgemfileにこれらの行を置く:gemfileの作業で ":platforms =>"を使用していますか?

gem 'therubyracer', :platforms => :ruby 
gem 'execjs', :platforms => :ruby 

は、Linux VM上bundle install蘭とアプリは罰金を起動しました。しかし、Windows上で私が手:

Uncaught exception: Could not find execjs-1.2.11 in any of the sources

さて、私は(PLATFORMS下here)読んだもの、それは宝石だけ特定のプラットフォームで使用されるか、またはプラットフォームを設定しなければならない場合は、ユーザーが指定することができます」と言われますから、 "ruby C Ruby (MRI) or Rubinius, but NOT Windows:彼らは」

gem "weakling", :platforms => :jruby 

そして、それは言うと、サンプルはこれです"。だから私には、バンドルラーはWindowsのexecjs行を無視するべきだと言われています。私はドキュメントについて何かが欠けていたりバンドラーは、プラットフォームのコマンドを無視している私に言うだから

Installing execjs (1.2.11) 

:しかし、私はbundle installを実行したときに、Windows上で、私はこれを見ました。私は何か間違っているのですか?

PS>bundle -v 
Bundler version 1.0.21 
+0

必要な情報は、GemfileのプラットフォームがOSではなくRubyの実装を指していることです。 :ruby ==:mriすべてのOSプラットフォーム上にあるので、宝石が1つのOSにインストールされないようにすることはできません。 – ffoeg

+1

@ffoegドキュメントの行(ruby:C Ruby ... NOT Windows)はあなたに同意しません – jcollum

+0

私は訂正します。あなたの質問に対する答えは変わりません。 Bundlerのプラットフォームは動作しますが、この場合に使用するメカニズムではありません。下の私の答えを見てください。 – ffoeg

答えて

18

:platforms => :ruby実際に宝石がWindowsにインストールされないようにします。

しかし、それはcygwin環境でではなく、です。 cygwinでは、プラットフォームはmriとみなされます。

あなたはruby -e 'puts RUBY_PLATFORM'出力i386-cygwin、ないi386-mingw32またはi386-mswinそれはWindowsのルビーの場合と同様ということもわかります。

cygwin環境で作業していましたか?

+0

_linux_または_darwin_ envについては、ここで説明したように、必要なものを使用するとうまくいくhttp://stackoverflow.com/a/16475580/933358 –

+1

'ruby -e 'putsをありがとうRUBY_PLATFORM'' – Paul

1

私が一度も使ったことのないプラットフォームスイッチについてはわかりません。しかし、あなたのシナリオでうまくいくと思う選択肢は、あなたのGemfileの 'group'ブロックにある2つの宝石の宣言をラップすることです。 ...

group :production do 
    gem 'therubyracer' 
    gem 'execjs' 
end 

このように、これらの宝石は、開発環境ではなく、運用環境でのみ使用されます。

私はbundlerがまだそれらを開発中に(依存性チェックと関係がある)インストールしますが、実際にロードされることはないので、問題は発生しないと考えています。プラットフォームの

+1

これは動作するかもしれませんが、実際に私の質問に答えることはありません。私はそれを回避するにはどうすればいいのか尋ねなかった。 – jcollum

+0

私はそれが問題に直接言及していないことに同意しますが、根底にある問題に対処しています。それは「回避」ではありません。それはあなたが気づいていない可能性があり、特定の状況に適しているかもしれない(あるいはそうでないかもしれない)と同等に有効な選択肢です。 –

10

このようにGemfileにコードを追加することが除外/ OSプラットフォームに応じて、宝石を含ん

if RUBY_PLATFORM=~ /win32/ 
    gem "windows-only-gem" 
else 
    gem "os-agnostic-gem" 
end 
+0

だから、ドキュメントは間違っていますか?それが私が実際にやっていることです。 – jcollum

+5

Gemfileで 'if'ブロックを使用することはできません。そうした場合、Gemfile.lockは再生され、異なるプラットフォームでプロジェクトにアクセスするたびに変更されます。 –

+0

なんで?あなたが放棄すべきいくつかの教義のように聞こえる。私たちはOSXを開発し、JRubyにデプロイします。 JRubyで生成されたGemfile.lockのみをチェックインします。 – ffoeg

3

バンドラーのコンセプトはRUBY_PLATFORMマッチングやRubyGemsの行動の通常の理解とは異なります。

あなたがここにバンドラーのためのプラットフォームを使用する方法についての全体のドキュメントを見つけることができます:あなたは(それが実際に動作しません)Windows上therubyracerを必要としないかもしれませんが、あなたはそうexecjsが必要な場合があります

http://bundler.io/v1.14/man/gemfile.5.html

をCoffeeScriptのか、資産パイプラインの仕事のその他の詳細適切

あなたのケースでは、私が行います。

gem "execjs" 
gem "therubyracer", :platforms => :ruby 

UPDATE:別の依存関係(プラットフォームによって制限されていない)がインストールされるため、execjs gemがインストールされる可能性があります。

0
gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/) 

これはかなりうまく動作します。

+0

これは回避策です答えよりも。 – jcollum

0

@ ffoegの回答の変化は、単にRUBY_PLATFORM=~ /win32/を使用して、一方では動作しませんでした、私のために働いた、とすべてのウィンドウ環境を処理します。

if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i 

    gem 'windows-only' 

else 

    gem 'non-windows'  

end 

私はしかし、それは別のgemfilesを持つことが理想的ではないことに同意します「Herokuの上で私のジキルのブログサービスを提供するためにunicornを使用してM、私はgem unicornを必要とする - いくつかのソースが確認されている、これはkgioに依存しているウィンドウの上にインストールすることは事実上不可能である...

0

Railsの5:

if Gem.win_platform? 
    # Install gem for Windows 
else 
    # Install another gem 
end 
関連する問題