faisceau de rails propre

88

Après la mise à jour d'un bundle, vous aurez des gemmes qui peuvent être obsolètes - puisqu'une version plus récente de cette gemme a été installée. Il n'y a pas de telle commande sous l' bundleexécutable ie bundle clean. Comment se débarrasser de ces joyaux obsolètes?

Il s'agit d'une tentative de réduire la taille des limaces dans mon application rails.

iGbanam
la source

Réponses:

131

Si vous utilisez Bundler 1.1 ou version ultérieure, vous pouvez l'utiliser bundle clean, comme vous l'aviez imaginé. Ceci est redondant si vous utilisez bundle install --path(Bundler gère l'emplacement que vous avez spécifié avec --path, prend donc la responsabilité de supprimer les gemmes obsolètes), mais si vous avez utilisé Bundler pour installer les gemmes en tant que gemmes système, alors bundle clean --forcesupprimera toutes les gemmes système non requis par votre Gemfile. Attention aveuglément évidente: ne faites pas cela si vous avez d'autres applications qui reposent sur des gemmes système qui ne sont pas dans votre Gemfile!

Pat Shaughnessy a une bonne description bundle cleanet d'autres nouveautés dans le bundler 1.1 .

David Waller
la source
30
Pour ceux qui utilisent rvm, notez que bundle clean --forcecela ne touche pas vos gemmes globales, mais uniquement celles de votre ensemble actuel. Donc bundle clean --forceproduit le même résultat que et est plus rapide puis rvm gemset emptysuivi de bundle install.
Gabe Kopley
19
AVERTISSEMENT: "Bundle clean --force" peut faire exploser un grand nombre de gemmes si vous ne faites pas attention. Cela devrait être la première ligne de cette réponse ... d'autant plus qu'elle a tant de voix. FAITES ATTENTION!
jerrylroberts
36

Si vous utilisez RVM, vous pouvez utiliser rvm gemset emptypour l'ensemble de gemmes actuel - cette commande supprimera toutes les gemmes installées dans l'ensemble de gemmes actuel (l'ensemble de gemmes lui-même restera en place). Ensuite, exécutez bundle installpour installer les versions réelles des gemmes. Assurez-vous également de ne pas supprimer les gemmes générales telles que rake, bundler, etc. pendant rvm gemset empty(si c'est le cas, installez-les manuellement via gem installavant bundle install).

trushkevich
la source
22

Si vous utilisez RVM, vous pouvez installer vos gemmes dans des ensembles de gemmes . De cette façon, lorsque vous souhaitez effectuer un nettoyage complet, vous pouvez simplement supprimer l'ensemble de gemmes, qui à son tour supprime toutes les gemmes qui y sont installées. Votre autre option consiste simplement à désinstaller vos gemmes inutilisées et à réexécuter votre bundle installcommande.

Étant donné que bundler est censé être un outil de gestion des versions de gem projet par projet, il ne fournit pas de bundle cleancommande. Cela signifierait la possibilité de supprimer également les gemmes associées à d'autres projets, ce qui ne serait pas souhaitable. Cela signifie que le bundler est probablement le mauvais outil à utiliser pour gérer votre répertoire gem. Ma recommandation personnelle serait d'utiliser les jeux de gemmes RVM pour bac à sable vos gemmes dans certains projets ou versions ruby.

Pan Thomakos
la source
41
Pas besoin de supprimer l'ensemble de gemmes, vous pouvez simplement taper «rvm gemset empty gemset_name», puis relancer «bundle install».
JAG
Excellente explication. Savoir cela à propos de bundler aide. Merci.
Volte
9
bundle clean --force will do the job
sailor
avec rvm, effacez le dossier .rvm / gems / ruby-xxxxxx / specs si "bundle install" refuse de retélécharger les gemmes.
barbacan
@JAG J'ajouterais que vous devez 'gem install bundler' après avoir nettoyé gemset pour pouvoir appeler bundle install
maleta
13

Honnêtement, j'ai eu des problèmes avec les dépendances circulaires de bundler et la meilleure façon de procéder est rm -rf .bundle. Épargnez-vous le mal de tête et utilisez simplement le marteau.

Tyler Brock
la source
1
J'ai dû faire ça pour que ça cesse de me déranger sur "vous devez appeler bundle install avec --no-deployment". Merci
Kevin
2
Merci pour l'idée. Bien que pour moi, l'utilisation d'un plus gros marteau ait aidé. rvm implode --forcepuis réinstaller rvm
Ryan
1

Je suppose que vous installez des gemmes vendor/bundle? Si oui, pourquoi ne pas simplement supprimer toutes les gemmes et faire un nettoyage bundle install?

Léonid Chevtsov
la source
mon répertoire de fournisseurs ne garde la trace des actifs et des plugins installés. Je suis sur Rails 3.1
iGbanam
Alors, quelle est la raison de supprimer les gemmes inutilisées si elles ne sont pas copiées lors du déploiement? Ils ne prennent pas beaucoup de place.
Leonid Shevtsov
je déploie cette application rails sur un intranet; ce qui signifie que je gère les fichiers et l'environnement localement. si vous connaissez des solutions que je peux utiliser pour cela, veuillez les partager.
iGbanam
0

Supprimez simplement les gemmes obsolètes de votre Gemfile. Si vous parlez d'Heroku (vous ne l'avez pas mentionné), le slug est compilé à chaque nouvelle version, en utilisant simplement le contenu actuel de ce fichier.

Gareth
la source
ce n'est pas nécessairement pour heroku. Je souhaite réduire la taille de l'application de rails elle-même.
iGbanam
0

Exécutez simplement, pour nettoyer les gemmes obsolètes et supprimer les avertissements d'impression après le bundle.

bundle clean --force

codevb
la source