2012-01-01 15 views
15

私はWindowsとLinuxの両方でSinatraを開発しています。問題は私がWebrickの代わりにThinを使っていることです.Windows用のイベントマシンは、プレリリース版でのみ動作し、Linuxは最新の安定版を使用しています。この問題を回避する方法があった場合、私は何を、多分WindowsおよびLinuxのための1 gemfileのための1 gemfileを使用して、思っていた異なるプラットフォーム用に異なるバージョンのgemをロードするためにbundlerを使用する

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win 
gem "eventmachine", group => :development_linux 
gem "thin 

:gemfileにもちろん、あなたはそうのような異なるバージョンと同じ宝石を含めることはできませんコマンドがどちらか一方をロードすることになります。

また、2つの異なるプラットフォーム用のgemfileをおそらくgitファイルで管理する方法があります。おそらくファイルのブランチを介してgitファイルを管理する方法があります。

答えて

20

マニュアルを参照してくださいあなたはそのようにそれを行うことができます。利用可能なプラットフォームの

# Windows 
gem "eventmachine", "~> 1.0.0.beta.4.1", :platform => [:mswin, :mingw] 

# C Ruby (MRI) or Rubinius, but NOT Windows 
gem "eventmachine", :platform => :ruby 

全リスト:あなたはGemfile(5) manページhereでより多くの情報を見つけることができます

ruby  C Ruby (MRI) or Rubinius, but NOT Windows 
ruby_18 ruby AND version 1.8 
ruby_19 ruby AND version 1.9 
ruby_20 ruby AND version 2.0 
mri  Same as ruby, but not Rubinius 
mri_18 mri AND version 1.8 
mri_19 mri AND version 1.9 
mri_20 mri AND version 2.0 
rbx  Same as ruby, but only Rubinius (not MRI) 
jruby  JRuby 
mswin  Windows 
mingw  Windows 'mingw32' platform (aka RubyInstaller) 
mingw_18 mingw AND version 1.8 
mingw_19 mingw AND version 1.9 
mingw_20 mingw AND version 2.0 

を( '参照プラットフォームのセクション)。

別のアプローチは、RUBY_PLATFORM定数を使用することです:

if RUBY_PLATFORM =~ /win32/ 
    gem "eventmachine", "~> 1.0.0.beta.4.1" 
else 
    gem "eventmachine" 
end 

私はRUBY_PLATFORMのために利用可能な値の完全なリストを見ていないが、あなたは両方のあなたのプラットフォーム上で

ruby -e 'puts RUBY_PLATFORM' 

を実行し、違いを見ることができます。

+3

ええと、最初の解決策は、gemfileで指定された2つのgemを持つという同じエラーを投げます。条件文は正常に動作します。 – indigo0086

+6

2番目のアプローチは無効です.1つまたは別のgemバージョンを 'Gemfile.lock'に保存するためです。両方を保存することはできません。したがって、Win32のマシンで 'Gemfile.lock'を準備し、それをLinuxにデプロイすれば、同じバージョンの間違いが発生します。 したがって、私はまだ有効な解決策を探しています。 –

+1

プラットフォーム:プラットフォームのアプローチは、プラットフォームによって異なる(名前のついた)宝石だけが必要な場合にはうまくいきます.Gemfile.lockをコミットして安定させることも可能です(if-elseアプローチとは違い) – prusswan

3

--gemfileオプションを使用すると、異なるプラットフォームで異なるgemファイルを使用できます。ここ http://gembundler.com/man/bundle-config.1.html

+0

:彼らはステートメントを含める場合、すなわち:しかし、これは例えば、両方Gemfile-linuxGemfile-windowsは自動的に、彼らが共通して共有するGemfileどんな文組み込む場合など改善します'different' Gemfile's '(別のgemファイルではありません); 2。'--gemfile'によって、環境変数' BUNDLE_GEMFILE'か(開発者のホームディレクトリの) '​​.bundle/config'ファイルの' gemfile'設定を意味します。したがって、Bundlerは安全に、例えば'Gemfile-linux.lock'と' Gemfile-windows.lock'です。 – MarkDBlackwell

0

宝石の複数のバージョン(すべて同じ名前)が必要です。したがって、現在Bundlerでは複数のBundler依存スナップショット 'ロック'ファイルが同時に必要です。これは、開発者がBundlerのgemfile構成設定を使用する場合に可能です。環境変数BUNDLE_GEMFILE(コマンドライン上または.bash_profile中)を利用することで

  1. ;:彼らは、このいずれかを行う可能性がありますまたは
  2. (おそらくあまり望ましくない).bundle/config(グローバルには、ホームディレクトリ内にある)。

したがって、安全に、Bundlerは、同じ構成設定を使用して、作成して(おそらくは自動的に後で使用する)ことができます。 Gemfile-linux.lockおよびGemfile-windows.lock

この基本的なアプローチは実行可能なように見えますが、あまり乾燥していません。 「異なるgemfiles」あなたが意味することにより1:私は仮定

::Kernel.eval(File.open('Gemfile-common','r'){|f| f.read},::Kernel.binding)

+0

何年も前からRubyを使用していませんでしたが、2012年の回答は満足できるものでした。 – indigo0086

関連する問題