2010-12-14 10 views
22

Tengo una pequeña aplicación web, que usa un montón de gemas. Algunos de ellos solo se usan para entornos test y development. Ahora, cuando intento iniciar Unicorn en el servidor de producción utilizando el siguiente comando, falla.bundler tratando incorrectamente de instalar gemas de grupo "desarrollo" y "prueba" en producción

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

El error que veo en los archivos de registro es:

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`. 

he pegado a mi 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 

Bündler se supone para detectar el entorno adecuado y pasar por alto la otras gemas, ¿verdad? En este momento, estoy borrando todas las líneas que no están en el grupo predeterminado en el servidor para que funcione, pero eso es un hack feo.

+0

Capistrano en la producción no parece correcto? –

Respuesta

52

Después de mucho excavar he encontrado la solución para este problema. Todo lo que tenía que hacer era ejecutar bundle install --without development test antes de iniciar el servidor. Esto agrega un archivo .bundle/config en la raíz de los rieles con la línea BUNDLE_WITHOUT: test:development. Ahora, cada vez que ejecuta bundle install o inicia el servidor, ignorará esos grupos.

From the documentation

El Bündler CLI le permite especificar una lista de grupos cuyas gemas paquete instalación no debe instalar con la opción --sin . Para especificar varios grupos a ignorar, especifique una lista de grupos separados por espacios.

bundle install --sin paquete de prueba instalar --sin prueba de desarrollo Después de ejecutar bundle install --sin prueba, bundler recordará que excluido el grupo de prueba en la última instalación . La próxima vez que ejecute la instalación del paquete , sin ninguna - sin la opción , el paquete la recuperará.

También, llamando Bundler.setup sin parámetros, o llamando requiere "bundler/configuración" a configurar todos los grupos a excepción de los que excluyó a través --sin (ya que obviamente no están disponibles).

+0

¡Esa fue una buena respuesta! –

+0

¡Gracias! Estaba buscando la sintaxis para el archivo de configuración :) BUNDLE_WITHOUT: test: development – Nultyi

+2

Creo que esto es solo un mal diseño. ¿Por qué no ignorar nada que no sea dev por defecto? No debería tener que agrupar en el archivo gem y excluir a través de la línea de comando. Debería establecerse de forma predeterminada en el entorno de desarrollo y luego incluir la producción o la prueba. De lo contrario, es mucha redundancia y dolores de cabeza durante el desarrollo. – PhillipKregg

-2

No ha definido un grupo de producción =)

+0

entonces, si tengo un grupo de "producción" vacío, ¿funcionará? –

+0

No sé, podrías intentar; p Mira si todavía le pide a la gema spork. – Icid

+0

Desafortunadamente no sé mucho sobre pruebas (o.O) – Icid

4

En mi caso, estaba instalando gemas de jenkins env. Así que tuve que establecer mi propio bundle_without variable en capistrano.

Gemfile

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

deploy.rb

set :bundle_without, [:development, :test, :jenkins] 
Cuestiones relacionadas