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

时间:2011-12-07 18:20:11

标签: ruby-on-rails ruby rubygems bundler

我正在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]


任何其他(优雅)方法?

5 个答案:

答案 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