如何添加Mac特定的gem在Mac上捆绑但不在Linux上捆绑?

我正在Mac上开发一个Rails应用程序,我是新手测试,所以我只是将这些gem添加到我的Gemfile中

group :test, :development do gem 'rspec-rails' gem 'rb-fsevent' gem 'growl' end 

但是我的生产服务器运行Linux,所以即使它们没有分组:production ,bundler( v1.0.21 )仍然会尝试安装它们。 ……显然失败了!
extconf.rb:19:in '': Only Darwin (Mac OS X) systems are supported (RuntimeError)

在运行bundle install之前将RAILS_ENV设置为production 不起作用

它运行bundle install --without development test ,但是如何仅通过基于您的操作系统的捆绑器来考虑这些gem?


编辑: bundler wiki提供有关如何使用platform作为参数的详细信息。
在捆绑问题#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]
'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]


还有其他(优雅的)方法吗?

Gemfile实际上是一个常规的ruby文件,所以你可以使用类似的东西

 case RUBY_PLATFORM when /darwin/ gem 'foo' when /win32/ gem 'bar' end 

Bundler wiki有一个方法可以将所有gems添加到Gemfile.lock,而不管平台如何。 它根据系统设置require => false ,因此您不需要能够实际运行gem:

 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设置是必需的 – Linux绑定器在’win32console’gem上被阻塞:

 Console.c:1:21: fatal error: windows.h: No such file or directory 

@ zed_0xff:在旧的rspec-core提交中找到了类似的方法:

 if RUBY_PLATFORM =~ /darwin/ gem 'foo' end 

您可以使用:install_if方法,它接受任意lambda。

以下示例直接来自Gemfile的手册页:

 install_if -> { RUBY_PLATFORM =~ /darwin/ } do gem "pasteboard" end 

它比控制流构造(例如if )要好得多,因为它可以正确地维护依赖关系,并在所有机器上保持Gemfile.lock一致。

根据Bundler文档 ,您需要使用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平台:

ruby C Ruby(MRI)或Rubinius,但不是Windows

ruby_18 ruby AND版本1.8

ruby_19 ruby AND版本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 Windows

mingw Windows’mingw32’平台(又名RubyInstaller)

mingw_18 mingw和版本1.8

mingw_19 mingw AND version 1.9 mingw_20 mingw AND version 2.0