работает ": platform =>" в вашем gemfile? - PullRequest
15 голосов
/ 07 декабря 2011

У меня есть приложение Rails, которое я разрабатываю для Windows и внедряю в Linux. Я подозреваю, что в будущем просто полностью переключусь на Linux. В любом случае, в Linux мне нужны execjs и therubyracer, но в Win7 они мне не нужны. Поэтому я поместил эти строки в свой gemfile:

gem 'therubyracer', :platforms => :ruby
gem 'execjs', :platforms => :ruby

Запустил 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)

Итак, это говорит мне, что я что-то упускаю из-за того, что документация или упаковщик игнорируют команду платформы. Я делаю что-то неправильно?

PS>bundle -v
Bundler version 1.0.21

Ответы [ 7 ]

19 голосов
/ 19 июля 2012

:platforms => :ruby действительно исключает возможность установки драгоценных камней в Windows.

Тем не менее, не работает в среде cygwin .В cygwin он считает платформу: mri.

Вы также заметите, что ruby -e 'puts RUBY_PLATFORM' выводит i386-cygwin, а не i386-mingw32 или i386-mswin, как это было бы в Windows ruby.

Вы работали в среде Cygwin?

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

Добавить код в Gemfile, как этот, который исключает / включает гемы в зависимости от платформы ОС

if RUBY_PLATFORM=~ /win32/ 
   gem "windows-only-gem"
else
   gem "os-agnostic-gem"
end
4 голосов
/ 11 декабря 2011

Концепция платформы 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

ОБНОВЛЕНИЕ: возможно, execjs gem установлен, потому что от него зависит другая зависимость (не ограниченная платформами).

2 голосов
/ 24 февраля 2018

Рельсы 5:

if Gem.win_platform?
  # Install gem for Windows
else
  # Install another gem
end
1 голос
/ 08 декабря 2011

Я не уверен насчет переключателя платформы: я никогда не использовал его.Однако альтернатива, которая, я думаю, будет работать для вашего сценария, заключалась бы в том, чтобы обернуть ваши объявления для этих двух драгоценных камней в блок 'group' в вашем Gemfile.Такие как ...

group :production do
  gem 'therubyracer'
  gem 'execjs'
end

Таким образом, эти драгоценные камни будут использоваться только в вашей производственной среде, а не в разработке.

Обратите внимание, что я считаю, что упаковщик все равно установит их в разработкечто-то делать с проверкой зависимостей), но на самом деле они не будут загружены и, следовательно, не должны вызывать проблем.

0 голосов
/ 04 января 2018

Вариант ответа @ ffoeg работал для меня и обрабатывает все среды Windows, тогда как простое использование RUBY_PLATFORM=~ /win32/ не сработало:

if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i

  gem 'windows-only'

else

  gem 'non-windows'    

end

Я согласен, что не идеально иметь разные gem-файлы, однако, поскольку я использую unicorn для обслуживания своего блога Jekyll на Heroku, поэтому мне нужно gem unicorn - и это зависит от kgio, что подтвердили несколько источников практически невозможно установить на Windows ...

0 голосов
/ 18 января 2015
gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)

Это хорошо работает для меня.

...