Подтвердить что ты не робот

Использует ли ": 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
4b9b3361

Ответ 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, который подтвердил несколько источников практически невозможно установить на окна...