2010-12-14 88 views
22

J'ai une petite application web, qui utilise un tas de gemmes. Certains d'entre eux sont uniquement utilisés pour les environnements test et development. Maintenant, lorsque j'essaie de démarrer licorne sur le serveur de production à l'aide de la commande suivante, il échoue.bundler essayant incorrectement d'installer des gemmes de groupe "développement" et "test" en production

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

L'erreur que je vois dans les fichiers journaux est:

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

J'ai collé mon Gemfile ci-dessous:

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 est censé détecter l'environnement droit et ignorer la d'autres gemmes, non? En ce moment, je supprime toutes les lignes qui ne sont pas dans le groupe par défaut sur le serveur pour que cela fonctionne, mais c'est un hack moche.

+0

Capistrano dans la production ne semble pas? –

Répondre

52

Après beaucoup de creuser, j'ai trouvé la solution à ce problème. Tout ce que j'avais à faire était de lancer bundle install --without development test avant de démarrer le serveur. Cela ajoute un fichier .bundle/config dans la racine des rails avec la ligne BUNDLE_WITHOUT: test:development. Maintenant, lorsque vous exécutez bundle install ou démarrez le serveur, il ignore ces groupes.

From the documentation

Le Bundler CLI vous permet de spécifier une liste des groupes dont les pierres précieuses bundle ne doit pas installer installer avec l' --without. Pour spécifier plusieurs groupes à ignorer, spécifiez une liste de groupes séparés par des espaces.

bundle

installer bundle test --without installer --without test de développement Après avoir exécuté paquet d'installation --without test, Bundler se souviendra que vous excluez le groupe de test dans la dernière installation . La prochaine fois que vous exécuterez l'installation groupée , sans l'option --without , bundler la rappellera.

En outre, appelant Bundler.setup sans paramètres, ou en appelant nécessitent « Bundler/setup » configure tous les groupes , sauf pour ceux qui vous avez exclus par --without (car ils ne sont évidemment pas disponibles).

+0

C'était une bonne réponse! –

+0

Merci! Était à la recherche de la syntaxe pour le fichier de configuration :) BUNDLE_WITHOUT: test: développement – Nultyi

+2

Je pense que c'est juste un mauvais design. Pourquoi ne pas ignorer tout ce qui n'est pas un dev par défaut? Vous ne devriez pas avoir à grouper dans le gemfile et à exclure à travers la ligne de commande. Il devrait par défaut à l'environnement de développement et ensuite vous incluez soit la production ou le test. Sinon, il y a beaucoup de redondances et de maux de tête pendant le développement. – PhillipKregg

-2

Vous n'avez pas défini un groupe de production =)

+0

Donc, si j'ai un groupe de "production" vide, cela fonctionnera-t-il? –

+0

Dunno, vous pourriez essayer; p Voir si elle demande encore la gemme de spork. – Icid

+0

Je ne sais pas grand-chose sur les tests malheureusement (o.O) – Icid

4

Dans mon cas, il s'agissait d'installer des gemmes de jenkins env. J'ai donc dû définir ma propre variable bundle_without dans 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]