Использует ли ": platform =>" в вашей работе gemfile?
У меня есть приложение Rails, которое я разрабатываю в Windows и развертываю в Linux. Я подозреваю, что в будущем я полностью перейду на Linux. В любом случае, в Linux мне нужны "execjs" и "therubyracer", но мне не нужны те, что были в Win7. Поэтому я помещаю эти строки в свой gemfile:
gem 'therubyracer', :platforms => :ruby
gem 'execjs', :platforms => :ruby
Ran a bundle install
на виртуальной машине Linux, и приложение запущено в порядке. Но в Windows я получаю:
Uncaught exception: Could not find execjs-1.2.11 in any of the sources
Теперь, из того, что я читал (здесь под PLATFORMS), он говорит мне, что "Если драгоценный камень должен использоваться только на определенной платформе или множество платформ, вы можете указать их", и образец таков:
gem "weakling", :platforms => :jruby
И он говорит "ruby C Ruby (MRI) or Rubinius, but NOT Windows
". Поэтому для меня это говорит о том, что поставщик пакетов должен игнорировать строку execjs
в Windows. Однако в Windows, когда я запускал bundle install
, я увидел это:
Installing execjs (1.2.11)
Итак, я говорю, что я пропускаю что-то, что касается документов или связующего, игнорирует команду platform. Я делаю что-то неправильно?
PS>bundle -v
Bundler version 1.0.21
Ответы
Ответ 1
:platforms => :ruby
действительно исключает возможность установки камней в Windows.
Однако он не работает в среде cygwin. В cygwin он считает платформу такой: mri.
Вы также заметите, что ruby -e 'puts RUBY_PLATFORM'
выводит i386-cygwin
, а не i386-mingw32
или i386-mswin
, как в рубине Windows.
Вы работали в среде cygwin?
Ответ 2
Добавить код в Gemfile, например, который исключает/включает драгоценные камни в зависимости от платформы ОС
if RUBY_PLATFORM=~ /win32/
gem "windows-only-gem"
else
gem "os-agnostic-gem"
end
Ответ 3
Концепция платформы Bundler отличается от обычного понимания соответствия RUBY_PLATFORM
или поведения RubyGems.
Здесь вы можете найти всю документацию о том, как использовать платформы для Bundler:
http://bundler.io/v1.14/man/gemfile.5.html
Вам может не понадобиться therubyracer
в Windows (на самом деле это не работает), но вам может понадобиться execjs
, чтобы CoffeeScript или другие детали Asset Pipeline работали правильно
В вашем случае я сделаю:
gem "execjs"
gem "therubyracer", :platforms => :ruby
UPDATE: execjs gem может быть установлен, потому что другая зависимость (не ограниченная платформами) зависит от установленного.
Ответ 4
Я не уверен в переключателе платформы, поскольку я никогда не использовал его. Тем не менее, альтернатива, которая, как я думаю, будет работать для вашего сценария, - это обернуть ваши объявления для этих двух драгоценных камней в блоке "группа" в вашем Gemfile. Такие, как...
group :production do
gem 'therubyracer'
gem 'execjs'
end
Таким образом, эти драгоценные камни будут использоваться только в вашей производственной среде, а не в разработке.
Обратите внимание, что я считаю, что bundler все равно будет устанавливать их в процессе разработки (что-то делать с проверкой зависимостей), но они фактически не загружаются и поэтому не должны вызывать проблем.
Ответ 5
gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
Это хорошо работает для меня.
Ответ 6
Отклик для ответа @ffoeg работал у меня и обрабатывал все окна, тогда как использование RUBY_PLATFORM=~ /win32/
не срабатывало:
if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i
gem 'windows-only'
else
gem 'non-windows'
end
Я согласен, что это не идеальный вариант для разных гем файлов, но поскольку я использую unicorn
для обслуживания своего блога Jekyll на Heroku, поэтому мне нужно gem unicorn
- и это зависит от kgio
, который подтвердил несколько источников практически невозможно установить на окна...