Как добавить жемчужины для Mac для связывания на Mac, но не на Linux? - PullRequest
26 голосов
/ 07 декабря 2011

Я разрабатываю приложение Rails на Mac, и я новичок в тестировании, поэтому я просто добавил эти гемы в свой 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, но как эти драгоценные камни могут быть учтены компоновщиком только в зависимости от вашей ОС?


Редактировать: Вики-сборщик предоставляет подробную информацию о том, как использовать платформу в качестве параметра .
То же решение дано в проблема с упаковщиком # 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.<br> The available options are: [:ruby, :ruby_18, :ruby_19, :mri, :mri_18, :mri_19, :rbx, :jruby, :mswin, :mingw, :mingw_18, :mingw_19]


Какие-нибудь другие (элегантные) подходы?

Ответы [ 5 ]

23 голосов
/ 10 мая 2013

В 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)

В моей системе Windows 7 x64 под управлением Ubuntu 12.04 на виртуальной машине Vagrant это работало нормально, но настройка :platforms была обязательной - сборщик Linux задушил гем 'win32console':

Console.c:1:21: fatal error: windows.h: No such file or directory
17 голосов
/ 07 декабря 2011

Gemfile на самом деле является обычным файлом ruby, поэтому вы можете использовать что-то вроде

case RUBY_PLATFORM
when /darwin/
  gem 'foo'
when /win32/
  gem 'bar'
end
7 голосов
/ 14 декабря 2015

Вы можете использовать :install_if метод, который принимает произвольную лямбду.

Следующий пример взят прямо из справочных страниц Gemfile:

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

Это намного лучше, чем конструкции потока управления (например, if), так как он правильно поддерживает зависимости и поддерживает единообразие Gemfile.lock на всех машинах.

7 голосов
/ 07 декабря 2011

@ zed_0xff: обнаружен похожий подход в старше rspec-core коммите :

if RUBY_PLATFORM =~ /darwin/
  gem 'foo'
end
1 голос
/ 16 октября 2016

Согласно документации 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 ​​И версия 1.8

ruby_19 rubyИ версия 1.9

ruby_20 ruby ​​И версия 2.0

mri То же, что и ruby, но не Rubinius

mri_18 mri AND версия 1.8

mri_19 mri AND версия 1.9

mri_20 mri AND версия 2.0 rbx То же, что и ruby, но только Rubinius (не MRI

jruby JRuby

mswin Windows

mingw Платформа Windows 'mingw32' (он же)RubyInstaller)

mingw_18 mingw И версия 1.8

mingw_19 mingw И версия 1.9 mingw_20 mingw И версия 2.0

...