работает ли использование :platforms =› в вашем gemfile?

У меня есть приложение 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

Итак, из того, что я прочитал (здесь в разделе ПЛАТФОРМЫ), говорится, что "Если драгоценный камень должны использоваться только на определенной платформе или наборе платформ, вы можете указать их», и пример таков:

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

person jcollum    schedule 07.12.2011    source источник
comment
Немного информации, которая вам нужна, заключается в том, что платформы в Gemfile относятся к реализации Ruby, а НЕ к ОС. :ruby == :mri на всех платформах ОС, поэтому вы не можете использовать это, чтобы предотвратить установку драгоценного камня в той или иной ОС.   -  person ffoeg    schedule 10.12.2011
comment
@ffoeg строка из документов (ruby: C Ruby ... НЕ Windows) с вами не согласна   -  person jcollum    schedule 10.12.2011
comment
Я исправляюсь. Ответ на ваш вопрос остается прежним. Платформы в Bundler работают, но это не тот механизм, который вы хотите использовать в данном случае. Смотрите мой ответ ниже.   -  person ffoeg    schedule 10.12.2011


Ответы (8)


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

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

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

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

person Edward Anderson    schedule 19.07.2012
comment
Для linux или darwin env использование требований, как описано здесь, тоже хорошо работает stackoverflow.com/a/16475580/933358 - person Daniël W. Crompton; 12.01.2014
comment
Спасибо за ruby -e 'puts RUBY_PLATFORM' - person Paul; 08.12.2014

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

if RUBY_PLATFORM=~ /win32/ 
   gem "windows-only-gem"
else
   gem "os-agnostic-gem"
end
person ffoeg    schedule 10.12.2011
comment
Значит, документы ошибочны? Вот чего я действительно пытаюсь добиться. - person jcollum; 11.12.2011
comment
Вы не можете использовать блоки if в своем Gemfile. Если вы это сделаете, то Gemfile.lock будет регенерироваться и изменяться каждый раз, когда к проекту обращаются на разных платформах. - person Luis Lavena; 11.12.2011
comment
Ну и что? Звучит как догма, от которой следует отказаться. Мы разрабатываем на OSX и развертываем в JRuby. Мы проверяем только Gemfile.lock, сгенерированный в JRuby. - person ffoeg; 11.12.2011
comment
@ffoeg: Я согласен, что ваш подход работает, но я думаю, что точка зрения Луиса Лавены важна для людей, которые следуют рекомендуемой практике проверки вашего Gemfile.lock всякий раз, когда вы добавляете новый гем или обновление пакета. И это неплохая практика — таким образом, все разработчики имеют одинаковые версии драгоценных камней (в идеале, за исключением тех, которые зависят от платформы). - person antinome; 10.10.2013

Рельсы 5:

if Gem.win_platform?
  # Install gem for Windows
else
  # Install another gem
end
person gdfgdfg    schedule 24.02.2018

Концепция платформы сборщика отличается от обычного понимания 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 может быть установлен, потому что от него зависит другая зависимость (не ограниченная платформами).

person Luis Lavena    schedule 10.12.2011

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

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

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

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

person Jon Garvin    schedule 07.12.2011
comment
Это может работать, но на самом деле не отвечает на мой вопрос. Я не спрашивал, как я могу это обойти, я спросил, должно ли это работать. - person jcollum; 08.12.2011
comment
Я согласен с тем, что это не решает вопрос напрямую, однако решает основную проблему. Это не обходной путь. Это в равной степени допустимая альтернатива, о которой вы, возможно, не знали, и которую вы можете (или не можете) считать подходящей для вашей конкретной ситуации. - person Jon Garvin; 08.12.2011

Легко, как

gem 'wdm', '~> 0.1.0' if Gem.win_platform?

Полный пример Gemfile с 1 зависимостью, предназначенной только для среды Windows.

source 'https://rubygems.org'

group :development, :test do
  gem 'jekyll', '>= 4.0.0'
  gem 'jekyll-target-blank', '>= 2.0.0'
  gem 'jekyll-redirect-from', '>= 0.15.0'
  gem 'jekyll-sitemap', '>= 1.4.0'
  gem 'jekyll-toc', '>= 0.12.2'
  gem  'rouge', '>= 3.14.0'
  gem 'wdm', '>= 0.1.1' if Gem.win_platform?
end
person djibe    schedule 15.12.2019

gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)

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

person almyz125    schedule 17.01.2015

Вариант ответа @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. .

person Lewy Blue    schedule 04.01.2018