упаковщик неправильно пытается установить гемы группы разработки и тестирования в производстве

У меня есть небольшое веб-приложение, которое использует кучу драгоценных камней. Некоторые из них используются только для сред test и development. Теперь, когда я пытаюсь запустить unicorn на рабочем сервере с помощью следующей команды, это не удается.

unicorn_rails -E production -D -c config/unicorn.rb

Ошибка, которую я вижу в файлах журнала:

Refreshing Gem list
Could not find gem 'spork (>= 0.9.0.rc2, runtime)' in any of the gem sources listed in your Gemfile.
Try running `bundle install`.

Я вставил свой gemfile ниже:

source 'http://rubygems.org'

gem 'rails', '3.0.1'
gem 'unicorn'
gem 'mongoid', '>= 2.0.0.beta.19'
gem 'devise'
gem 'cancan'
gem 'haml', '>= 3.0.0'
gem 'bson'
gem 'bson_ext'
gem 'formtastic'
gem 'bluecloth'

group :production do
  gem 'capistrano'
end

group :development do
  gem 'haml-rails'
  gem 'hpricot', '0.8.2'
  gem 'ruby_parser', '2.0.5'
  gem 'less'
  gem 'rspec-rails', '>= 2.0.1'
end

group :development,:test do
  gem 'spork', '>=0.9.0.rc2'
  gem 'mongoid-rspec'
end

group :test do
  gem 'factory_girl_rails'
  gem 'autotest'
  gem 'cucumber-rails'
  gem 'cucumber'
  gem 'capybara'
  gem 'shoulda'
  gem 'database_cleaner'
  gem 'test_notifier'
  gem 'rspec', '2.0.1'
  gem 'launchy' 
end

Предполагается, что Bundler определяет правильную среду и игнорирует другие драгоценные камни, верно? Прямо сейчас я удаляю все строки, которые не входят в группу по умолчанию на сервере, чтобы заставить это работать, но это уродливый хак.


person Khaja Minhajuddin    schedule 14.12.2010    source источник
comment
Capistrano в производстве кажется неправильным?   -  person Koen.    schedule 30.05.2013


Ответы (3)


После долгих копаний я нашел решение этой проблемы. Все, что мне нужно было сделать, это запустить bundle install --without development test перед запуском сервера. Это добавляет файл .bundle/config в корень rails со строкой BUNDLE_WITHOUT: test:development . Теперь всякий раз, когда вы запускаете bundle install или запускаете сервер, он будет игнорировать эти группы.

Из документации

Интерфейс командной строки Bundler позволяет вам указать список групп, для которых установка пакета gems не должна устанавливаться с параметром --without. Чтобы указать несколько игнорируемых групп, укажите список групп, разделенных пробелами.

bundle install --without test bundle install --without development test После запуска bundle install --without test упаковщик запомнит, что вы исключили тестовую группу при последней установке. В следующий раз, когда вы запустите установку пакета без опции --without, пакет запомнит его.

Кроме того, вызов Bundler.setup без параметров или вызов require "bundler/setup" настроит все группы, кроме тех, которые вы исключили с помощью --without (поскольку они, очевидно, недоступны).

person Khaja Minhajuddin    schedule 15.12.2010
comment
Спасибо! Искал синтаксис конфига :) BUNDLE_WITHOUT: test:development - person iNulty; 03.01.2014
comment
Я думаю, что это просто плохой дизайн. Почему бы не игнорировать все, что не относится к разработчикам по умолчанию? Вам не нужно группировать в gemfile и исключать через командную строку. По умолчанию это должна быть среда разработки, а затем вы включаете либо производственную, либо тестовую среду. В противном случае это много избыточности и головной боли во время разработки. - person PhillipKregg; 28.09.2014
comment
@PhillipKregg Bundler не имеет представления о среде разработки в отличие от групп драгоценных камней. Rails это делает, но Bundler не должен связывать свое поведение при установке с внутренностями другого гема (и не каждый проект использует Rails). - person Marnen Laibow-Koser; 21.05.2015

В моем случае это была установка драгоценных камней из jenkins env. Поэтому мне пришлось установить свою собственную переменную bundle_without в capistrano.

Gemfile

group :test, :development, :jenkins do  
  gem 'test-unit', '1.2.3'  
  gem 'rspec-rails'
end

развернуть.rb

set :bundle_without, [:development, :test, :jenkins]
person Pratik Khadloya    schedule 13.04.2012

Вы не определили производственную группу =)

person Icid    schedule 14.12.2010
comment
Не знаю, ты можешь попробовать ;p Посмотрим, по-прежнему ли он запрашивает драгоценный камень spork. - person Icid; 14.12.2010
comment
К сожалению, я не так много знаю о тестировании (o.O) - person Icid; 14.12.2010
comment
только что попробовал с производственной группой, содержащей капистрано, все равно выдает ту же ошибку :( - person Khaja Minhajuddin; 14.12.2010
comment
Вы уверены, что установили правильную среду в spec_helper? Проверьте это: railstutorial.org/chapters/static-pages#sec:spork - person Icid; 14.12.2010
comment
на самом деле я просто удалил группы :test и :development, :test (я не удалял группу :development). Теперь он жалуется на «hpricot» - person Khaja Minhajuddin; 14.12.2010
comment
Ну, вам нужны hpricot, ruby_parser и меньше в вашей производственной среде. Поэтому вам также необходимо добавить их в производственную группу. - person Icid; 14.12.2010
comment
Разве производственная группа не должна иметь драгоценные камни, которые необходимы в production, а не драгоценные камни, которые не должны быть загружены? - person Khaja Minhajuddin; 14.12.2010
comment
Верно. Какова цель hpricot в вашем приложении? - person Icid; 14.12.2010
comment
он используется для преобразования devise представлений erb в haml - person Khaja Minhajuddin; 14.12.2010