371 votes

Que signifie "bundle exec rake" ?

Qu'est-ce que bundle exec rake db:migrate C'est-à-dire ? Ou juste bundle exec rake <command> en général ?

Je comprends que bundle s'occupe de maintenir les choses dans le Gemfile. Je sais ce que le mot "exec" signifie. Je comprends que rake maintient toutes les différentes choses scripturales que vous pouvez faire, et je sais que db:migrate est l'un de ceux-là. Je ne sais pas ce que tous ces mots font ensemble. Pourquoi bundle être utilisé pour exécuter rake pour exécuter une migration de base de données ?

490voto

ghoppe Points 10004

bundle exec est un Regroupement pour exécuter un script dans le contexte du bundle courant (celui de votre répertoire). Gemfile ). rake db:migrate est le script où db est l'espace de nom et migrer est le nom de la tâche définie.

Alors bundle exec rake db:migrate exécute le rake script avec la commande db:migrate dans le contexte du faisceau actuel.

Quant au "pourquoi ?" Je vais citer le page de regroupement :

Dans certains cas, l'exécution d'exécutables sans bundle exec peut fonctionner, si l'exécutable est installé sur votre système et ne contient pas de gemmes en conflit avec votre paquet.

Cependant, ce système n'est pas fiable et est la source de douleurs considérables. Même si cela semble fonctionner, cela peut ne pas fonctionner à l'avenir ou sur une autre machine.

0 votes

La meilleure explication de ce que signifie bundle exec. Merci.

7 votes

Cela signifie-t-il que nous devons toujours exécuter bundle exec, j'ai utilisé ruby version manager pour installer ruby et ruby on rails.

0 votes

Un peu difficile à comprendre quand on utilise le terme dans la définition. Pouvez-vous expliquer ce qu'est un bundle est ?

166voto

Rose Perrone Points 14478

Tu es en train de courir bundle exec sur un programme. Les créateurs du programme l'ont écrit lorsque certaines versions de gems étaient disponibles. Le Gemfile du programme spécifie les versions des gemmes que les créateurs ont décidé d'utiliser. C'est-à-dire que le script a été fait pour fonctionner correctement contre ces versions de gemmes.

Le Gemfile de votre système peut différer de ce Gemfile. Vous pouvez avoir des gemmes plus récentes ou plus anciennes avec lesquelles ce script ne joue pas bien. Cette différence de versions peut vous donner des erreurs bizarres.

bundle exec vous aide à éviter ces erreurs. Il exécute le script en utilisant les gems spécifiés dans le Gemfile du script plutôt que le Gemfile du système. Il exécute les certaines versions de gemmes avec la magie des alias de shell.

Voir plus sur la page de manuel .

Voici un exemple de Gemfile :

source 'http://rubygems.org'

gem 'rails', '2.8.3'

Ici, bundle exec exécuterait le script en utilisant la version 2.8.3 de rails et non une autre version que vous avez peut-être installée sur l'ensemble du système.

10 votes

J'aime mieux cette réponse que celle choisie par le PO :D ! Elle est beaucoup plus claire.

1 votes

Donc pour ajouter à cet exemple : si la personne a simplement couru rake db:migrate en laissant de côté bundle exec alors il s'exécuterait en utilisant un Gemfile à l'échelle du système où l'on peut avoir un rack à 1.5.2 (dernière version) ?

0 votes

Bien meilleure réponse, avec des exemples concrets.

11voto

Benjamin Dunphy Points 81

Cela arrive souvent lorsque votre gemfile.lock contient différentes versions des gemmes installées sur votre machine. Vous pouvez obtenir un avertissement après avoir exécuté rake (ou rspec ou autres) tel que :

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

Prédominant bundle exec indique au regroupeur d'exécuter cette commande, quel que soit le différentiel de version. Ce n'est pas toujours le cas, mais vous pouvez rencontrer des problèmes.

Heureusement, il existe une gemme qui résout ce problème : rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

Puis réessayez votre rake, rspec, ou autre.

0 votes

C'est toujours une excellente solution en 2020.

7voto

tschale Points 165

Il faut sans doute mentionner qu'il existe des moyens d'omettre bundle exec (ils sont tous énoncés dans le chapitre 3.6.1 de Michael Hartls Tutoriel Ruby on Rails livre).

Le plus simple est d'utiliser une version suffisamment à jour de RVM (>= 1.11.x).

Si vous êtes limité à une version antérieure de RVM, vous pouvez toujours utiliser cette méthode également mentionnée par calasyr :

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

Le site bundler_stubs doit alors également être ajouté au répertoire .gitignore archivo.

Une troisième option consiste à utiliser l'option rubygems-bundler si vous n'utilisez pas RVM :

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1voto

calasyr Points 116

Je n'ai pas utilisé bundle exec mais je suis en train de le mettre en place.

Il m'est arrivé d'utiliser le mauvais râteau et de perdre beaucoup de temps à chercher le problème. Ce système vous permet d'éviter cela.

Voici comment configurer RVM pour que vous puissiez utiliser bundle exec par défaut dans un répertoire de projet spécifique :

https://thoughtbot.com/blog/use-bundlers-binstubs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X