использование компоновщика для загрузки разных версий гемов для разных платформ - PullRequest
15 голосов
/ 02 января 2012

Итак, я разрабатываю Sinatra для Windows и Linux. Проблема в том, что я использую Thin вместо Webrick, а eventmachine для Windows работает только с предварительной версией, в то время как 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).

Ответы [ 3 ]

20 голосов
/ 02 января 2012

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

# 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 page здесь (см. Раздел «Платформы»).

Другой подход заключается в использовании 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'

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

3 голосов
/ 02 января 2012

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

0 голосов
/ 17 мая 2016

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

  1. Используя переменную окружения BUNDLE_GEMFILE (в командной строке или в .bash_profile); или
  2. (вероятно, менее желательно) в .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)

...