我正在Mac上开发Rails应用程序,我是新手测试,所以我只是将这些宝石添加到我的 Gemfile :
group :test, :development do
gem 'rspec-rails'
gem 'rb-fsevent'
gem 'growl'
end
但是我的生产服务器运行Linux,所以即使它们没有分组在:production
中,bundler( v1.0.21 )仍会尝试安装它们。 ......显然失败了!
extconf.rb:19:in '<main>': Only Darwin (Mac OS X) systems are supported (RuntimeError)
在运行RAILS_ENV
之前将bundle install
设置为正常。
它通过运行bundle install --without development test
起作用,但是如何仅基于您的操作系统将捆绑器考虑这些宝石?
修改:捆绑包维基提供了有关如何use platform as a parameter的详细信息 在bundler issue #663中给出了相同的解决方案,所以我尝试了:
group :test, :development do
gem 'rspec-rails'
platforms :darwin do
gem 'rb-fsevent'
gem 'growl'
end
end
bundle install
不起作用,但即使我们回到原点并做到了
bundle install --without darwin
,结果为'darwin' is not a valid platform.
The available options are: [:ruby, :ruby_18, :ruby_19, :mri, :mri_18, :mri_19, :rbx, :jruby, :mswin, :mingw, :mingw_18, :mingw_19]
任何其他(优雅)方法?
答案 0 :(得分:23)
Bundler wiki有一种将所有宝石添加到Gemfile.lock 的方法,无论平台如何。它根据系统设置require => false
,因此您无需实际运行宝石:
gem 'rb-inotify', :require => RUBY_PLATFORM.include?('linux') && 'rb-inotify'
他们提供了帮助方法来实现这一目标:
def os_is(re)
RbConfig::CONFIG['host_os'] =~ re
end
gem 'rb-fsevent', "~> 0.9.3", platforms: :ruby, install_if: os_is(/darwin/)
gem 'rb-inotify', "~> 0.8.8", platforms: :ruby, install_if: os_is(/linux/)
gem 'wdm', "~> 0.1.0", platforms: [:mswin, :mingw. :x64_mingw], install_if: os_is(/mingw|mswin/i)
在我在Vagrant VM中运行Ubuntu 12.04的Windows 7 x64系统上,这很好用,但需要:platforms
设置 - 在“win32console”gem上阻塞Linux捆绑包:
Console.c:1:21: fatal error: windows.h: No such file or directory
答案 1 :(得分:16)
Gemfile实际上是一个常规的ruby文件,所以你可以使用像
这样的东西case RUBY_PLATFORM
when /darwin/
gem 'foo'
when /win32/
gem 'bar'
end
答案 2 :(得分:7)
@ zed_0xff:在older rspec-core
commit中找到了类似的方法:
if RUBY_PLATFORM =~ /darwin/
gem 'foo'
end
答案 3 :(得分:7)
您可以使用接受任意lambda的:install_if
方法。
以下示例直接来自Gemfile的手册页:
install_if -> { RUBY_PLATFORM =~ /darwin/ } do
gem "pasteboard"
end
它比控制流结构(例如if
)要好得多,因为它可以正确维护依赖关系并在所有机器上保持Gemfile.lock一致。
答案 4 :(得分:1)
根据Bundler docs,您需要使用platforms
指令:
#Gemfile
platforms :mswin do
gem "x"
end
gem "weakling", :platforms => :jruby
gem "ruby-debug", :platforms => :mri_18
gem "nokogiri", :platforms => [:mri_18, :jruby]
有许多Gemfile平台:
<强>红宝石强> C Ruby(MRI)或Rubinius,但不是Windows
<强> ruby_18 强> 红宝石和版本1.8
<强> ruby_19 强> ruby AND version 1.9
<强> ruby_20 强> ruby AND 2.0版
<强> MRI 强> 与ruby相同,但不是Rubinius
<强> mri_18 强> mri和版本1.8
<强> mri_19 强> mri和版本1.9
<强> mri_20 强> mri和版本2.0 rbx与ruby相同,但是 只有Rubinius(不是MRI
<强> jruby的强> JRuby的
<强> mswin 强> 视窗
<强> mingw的强> Windows'mingw32'平台(又名RubyInstaller)
<强> mingw_18 强> mingw和版本1.8
<强> mingw_19 强> mingw和版本1.9 mingw_20 mingw AND版本2.0