С помощью 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)