如何添加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