С помощью bundler для загрузки различных версий драгоценных камней для разных платформ

Итак, я разрабатываю Sinatra для обоих окон и Linux. Проблема в том, что я использую Thin вместо Webrick, а eventmachine для окон работает только с предварительной версией, в то время как linux использует последнюю стабильную версию. в gemfile вы, конечно, не можете включить один и тот же камень с разными версиями:

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win
gem "eventmachine", group => :development_linux
gem "thin

Мне было интересно, есть ли способ обойти это, возможно, используя один gemfile для Windows и один gemfile для linux, что бы команда могла загрузить тот или другой.

В качестве альтернативы есть способ, возможно, в git управлять только gemfile для двух разных платформ, возможно, через ветку только для файла (не знаю, возможно ли это из того, что я прочитал из ветвей git).

Ответы

Ответ 1

Вы можете сделать это следующим образом:

# Windows
gem "eventmachine", "~> 1.0.0.beta.4.1", :platform => [:mswin, :mingw]

# C Ruby (MRI) or Rubinius, but NOT Windows
gem "eventmachine", :platform => :ruby

Полный список доступных платформ:

ruby      C Ruby (MRI) or Rubinius, but NOT Windows
ruby_18   ruby AND version 1.8
ruby_19   ruby AND version 1.9
ruby_20   ruby AND version 2.0
mri       Same as ruby, but not Rubinius
mri_18    mri AND version 1.8
mri_19    mri AND version 1.9
mri_20    mri AND version 2.0
rbx       Same as ruby, but only Rubinius (not MRI)
jruby     JRuby
mswin     Windows
mingw     Windows 'mingw32' platform (aka RubyInstaller)
mingw_18  mingw AND version 1.8
mingw_19  mingw AND version 1.9
mingw_20  mingw AND version 2.0 

Дополнительную информацию можно найти в Gemfile(5) man здесь (см. раздел "Платформы" ).

Другой подход заключается в использовании константы RUBY_PLATFORM:

if RUBY_PLATFORM =~ /win32/
  gem "eventmachine", "~> 1.0.0.beta.4.1"
else
  gem "eventmachine"
end

Я не видел полный список доступных значений для RUBY_PLATFORM, но вы можете запустить

ruby -e 'puts RUBY_PLATFORM'

на обеих платформах и увидеть разницу.

Ответ 2

Вы можете использовать параметр -gemfile для использования разных gemfiles для разных платформ. См. Документацию здесь http://gembundler.com/man/bundle-config.1.html

Ответ 3

Вам нужно несколько версий (все с тем же именем) драгоценного камня. Поэтому, в настоящее время с Bundler, вам нужно несколько одновременных снимков блокировки "блокировки" зависимостей привязки. Это возможно, если ваши разработчики используют настройку конфигурации Bundler gemfile. Они могут сделать это:

  • Используя переменную окружения BUNDLE_GEMFILE (в командной строке или в .bash_profile); или
  • (вероятно, менее желательно) в .bundle/config (глобально, в их домашних каталогах).

Таким образом, безопасно, Bundler может создавать (и предположительно автоматически использовать позже, учитывая те же настройки конфигурации), например. Gemfile-linux.lock и Gemfile-windows.lock.

Хотя этот базовый подход кажется работоспособным, он не очень СУХОЙ. Однако это улучшает, если, например, как Gemfile-linux, так и Gemfile-windows автоматически включают все общие заявления Gemfile, которые они совместно используют: например, если они включают оператор:

::Kernel.eval(File.open('Gemfile-common','r'){|f| f.read},::Kernel.binding)