使用bundler为不同平台加载不同版本的gem

ind*_*086 15 ruby git sinatra bundler

所以我正在为Windows和Linux开发Sinatra.问题是我使用的是Thin而不是Webrick,而eventmachine for windows仅适用于预发布版本,而linux使用最新的稳定版本.在gemfile中你当然不能包含不同版本的相同gem,如下所示:

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win
gem "eventmachine", group => :development_linux
gem "thin
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法解决这个问题,可能使用一个用于windows的gemfile和一个用于linux的gemfile,该命令将加载一个或另一个.

或者有一种方法可能在git中管理两个不同平台的gemfile,也许只通过文件的分支(不知道这是否可能来自我读过的git分支).

KL-*_*L-7 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
Run Code Online (Sandbox Code Playgroud)

可用平台的完整列表:

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 
Run Code Online (Sandbox Code Playgroud)

您可以在此处的Gemfile(5)手册页中找到更多信息(请参阅"平台"部分).

另一种方法是使用RUBY_PLATFORM常量:

if RUBY_PLATFORM =~ /win32/
  gem "eventmachine", "~> 1.0.0.beta.4.1"
else
  gem "eventmachine"
end
Run Code Online (Sandbox Code Playgroud)

我还没有看到可用值的完整列表,RUBY_PLATFORM但您可以运行

ruby -e 'puts RUBY_PLATFORM'
Run Code Online (Sandbox Code Playgroud)

在你的平台上,看看差异.

  • 第二种方法无效,因为它将一个或另一个gem版本存储到`Gemfile.lock`中.它不能同时存储.因此,如果您在Win32开发计算机上准备`Gemfile.lock`然后将其部署到Linux,您将得到相同的错误版本.因此,我仍在寻找有效的解决方案. (6认同)
  • 嗯,第一个解决方案抛出了关于在gemfile中指定两个gem的相同错误.条件语句工作正常. (3认同)