Production d'installation de l'ensemble Rails uniquement

87

Je suis encore nouveau sur rails / ruby ​​/ bundler et je suis un peu confus.

Dans notre config/application.rbfichier, il y a ce segment de bundler:

if defined?(Bundler)         
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

et dans notre Gemfilenous utilisons différents groupes, par exemple

group :development, :test do
  gem "rspec-rails", ">= 2.7.0", :group => [:development, :test]
  gem 'shoulda-matchers'
  gem 'watchr'
  gem 'spork', '~> 1.0rc'
  gem 'spectator'                          
  gem 'debugger'
  gem 'wirble'
end

Mais quand je lance RAILS_ENV=production bundle install(ou bundle install --deployment), il installe toujours des gemmes du groupe de développement / test ...

Pourquoi cela se produit-il ou comment puis-je faire en sorte que cela fonctionne correctement?

gingembre
la source

Réponses:

182

Jetez un œil à l' --withoutoption:

bundle install --without development test

Par défaut, Bundler installe tous les gemmes et votre application utilise les gemmes dont elle a besoin. Bundler lui-même ne sait rien de Rails et de l'environnement actuel.

Simon Perepelitsa
la source
3
Je sais --without, mais cela semble très élégant, en particulier compte tenu de ces directives de configuration dans config/application.rb(qui sont censées répondre exactement à cela) et également de cette citation: Rails 3 est livré avec un support cuit avec bundler.
gingerlime
2
La commande d'installation du bundle est totalement indépendante de Rails. Il regarde juste dans votre Gemfile, il ne se soucie pas des bibliothèques dont votre application a réellement besoin dans la configuration mentionnée. En fait, vous pouvez ignorer Bundler.require et exiger manuellement des bibliothèques de n'importe quel groupe. Je suis d'accord, que Rails pourrait mieux s'intégrer dans ce cas avec Bundler, mais ce n'est pas le cas.
Simon Perepelitsa
2
Je vois. Donc je suppose qu'il est juste de dire que les rails connaissent bundler (ie in config/application.rbet aussi config/boot.rb), mais que bundler ne sait rien des rails ... Il ne lit que le Gemfile et n'utilise aucun de ces fichiers rails. Je pense que la pièce a finalement chuté. Merci de votre aide!
gingerlime
en fait, cela semble élégant car il exclut les `` groupes '' dans votre Gemfile, pas les environnements dans votre application Rails. Je sais que cela a été dit, mais quand j'y ai pensé de cette façon, cela me semblait plus logique.
jaydel le
1
Je ne sais pas si c'est quelque chose qui a changé au cours des quatre dernières années, mais les arguments --withoutsont censés être séparés par des :s et non par des espaces. Donc je pense que ça devrait l'être bundle install --without development:test.
Joe Freeman le
2

Une solution alternative consiste à utiliser la bundle-onlygemme rubis . Il peut être utilisé comme suit:

> gem install bundle-only
> bundle-only production

Cette bibliothèque ne pollue ni ne pollue vos configurations de bundler Gemfile.lock; c'est une alternative simple à l' bundle --without every other groupoption intégrée qui bundlerfournit.

Tom Lord
la source