'sudo gem install' ou 'gem install' et emplacements des gemmes

140

Courir ' sudo gem list --local' et ' gem list --local' me donnent des résultats différents. Mon chemin de gemme est défini dans mon dossier personnel et contient uniquement les gemmes de ' gem list --local'.

Ce n'est probablement pas bon d'avoir des gemmes installées dans différents répertoires sur mon ordinateur, alors devrais-je avoir le chemin des gemmes défini différemment, et devrais-je toujours l'utiliser sudolors de l'installation de quelque chose?

my ~/.profile
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"

~ / .bash_profile est vide.

raphael_turtle
la source
1
Je pense que c'est une question valable pour ceux d'entre nous qui doivent utiliser une gemme qui nécessite des privilèges root.
Kelly
Connexes: stackoverflow.com/questions/21141584/… . J'utilise rbenv pour gérer les versions de Ruby et j'ai rencontré un problème car j'ai utilisé à la sudo gem install railsplace de gem install rails.
Dennis
3
"Je pense que c'est une question valable pour ceux d'entre nous qui doivent utiliser une gemme qui nécessite des privilèges root." Je pense que tout bijou qui a besoin de privilèges root, soit pour être installé, soit pour s'exécuter, est très suspect. Les gemmes doivent pouvoir s'exécuter dans un bac à sable et s'exécuter avec les autorisations de l'utilisateur.
the Tin Man
1
sudoest une arme chargée pointée vers votre pied. L'utiliser sans comprendre ce qu'il fait et comment il peut affecter votre système, c'est comme appuyer sur la gâchette les yeux fermés. Vous pourriez tirer un trou dans votre pied, peut-être pas, mais dans tous les cas, vous ne voulez pas courir le risque à moins de savoir comment réparer les dégâts. Utilisation d' sudoécritures dans le Ruby appartenant au système, qui, sur Mac OS, a été installé par Apple pour ses propres utilisations. Nous pouvons nous en servir, mais changer la mauvaise chose peut casser leur code. C'est pourquoi nous installons à partir des sources ou utilisons quelque chose d'autre pour installer où nous pouvons le modifier en toute sécurité.
the Tin Man

Réponses:

146

Contrairement à tous les autres articles, je suggère de NE PAS utiliser sudolors de l'installation de gemmes.

Au lieu de cela, je vous recommande d'installer RVM et de commencer une vie heureuse avec des maisons de pierres précieuses portables et différentes versions de Ruby vivant toutes sous un même toit.

Pour les non-initiés, d'après la documentation :

RVM est un outil de ligne de commande qui nous permet d'installer, de gérer et de travailler facilement avec plusieurs environnements ruby ​​et ensembles de gemmes.

La raison pour laquelle l'installation de gemmes avec sudoest pire que juste gem installest qu'elle installe les gemmes pour TOUS LES UTILISATEURS comme root. Cela peut être bien si vous êtes la seule personne à utiliser la machine, mais si vous ne l'êtes pas, cela peut causer de l'étrangeté.

Si vous décidez que vous voulez souffler tous vos joyaux et recommencer, il est beaucoup plus facile et plus sûr de le faire en tant qu'utilisateur non root.

Si vous décidez que vous souhaitez utiliser, l' RVMutilisation sudocausera toutes sortes de bizarreries car chaque version de Ruby que vous installez RVMa son propre GEM_HOME.

De plus, c'est bien si vous pouvez rendre votre environnement de développement aussi proche que possible de votre environnement de production, et en production, vous installerez probablement des gemmes en tant qu'utilisateur non root.

jonnii
la source
12
+1 pour le RVM suggèrent, mais -1 pour la condamnation confuse de la possibilité alternative d'utiliser simplement sudo
tfwright
10
Ok, mais toutes vos raisons se résument à "parce que RVM est tellement génial" pas parce que l'utilisation de sudo est particulièrement nuisible. Le seul moment où vous ne voudriez pas, c'est dans la situation spécifique où vous êtes sur un ordinateur partagé. Si vous voulez recommander rvm, faites-le. Pas besoin de recourir au FUDD.
tfwright
6
J'essaie de ne pas répandre le FUD, et j'ai essayé de donner des raisons non-RVM, je m'excuse si cela semble être le cas.
jonnii
9
RVM est une bonne option. Mais vous devriez en essayer un meilleur, RBENV. C'est moins intrusif que RVM.
Andres
4
@ HontváriJózsefLevente, il est difficile de répondre à toutes vos questions dans un commentaire, mais en bref, vous voulez que votre environnement de développement soit aussi proche que possible de la production. si vous travaillez sur deux applications, dont l'une utilise ruby ​​2.1 et l'autre qui utilise 1.9, vous devrez vous assurer que votre environnement local utilise la bonne version. c'est ce que RVM ou RBENV fait pour vous. Vous l'utiliseriez pour la même raison que vous utiliseriez n'importe quel environnement sandbox, mais le principal avantage dans ce cas est l'isolation. J'espère que ça aide!
jonnii
128

Vous pouvez également installer des gemmes dans votre environnement local (sans sudo) avec

gem install --user-install <gemname>

Je recommande cela pour ne pas jouer avec la configuration de votre système, même s'il s'agit d'un ordinateur mono-utilisateur.

Vous pouvez vérifier où vont les gemmes en regardant gempaths avec gem environment. Dans mon cas, c'est "~ / .gem / ruby ​​/ 1.8".

Si vous avez besoin d'ajouter des binaires à partir d'installations locales à votre chemin, vous pouvez ajouter quelque chose à votre bashrc comme:

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

(à partir de http://guides.rubygems.org/faqs/#user-install )

Nils
la source
23
+1 pour cette option plutôt que les solutions «Encore un autre outil de configuration» ci-dessus, RBENV / RVM.
jjpe
Je crée un bijou et selon les manuels que je dois faire rake installet pour corriger le sudo isse, j'ai dû patcher manuellement l' /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rbajout --user-installlà-bas. Impossible de trouver une meilleure solution, car semble rake installn'accepte pas de paramètres supplémentaires.
Nakilon
Je suis absolument ravi de cette première commande. J'ai essayé d'installer des gemmes et j'ai eu des problèmes parce que je n'ai pas les privilèges sudo. Cette commande a fonctionné !!!!
Caleb Kleveter
34

Mieux encore, mettez --user-installvotre fichier ~ / .gemrc pour ne pas avoir à le taper à chaque fois

gem: --user-install
allyraza
la source
13

Au cas où vous

  • installé des gemmes de rubis avec sudo
  • voulez installer des gemmes sans sudo
  • ne veut pas installer rvm / rbenv

ajoutez ce qui suit à votre .bash_profile:

export GEM_HOME=/Users/your_user›/.gem
export PATH="$GEM_HOME/bin:$PATH"

Ouvrez un nouvel onglet dans Terminal OU source ~/.bash_profileet vous êtes prêt à partir!

David Salamon
la source
8
Pour quelqu'un qui ne travaille pas avec Ruby, Rails, Rake et tout ce que Ruby Devs utilise / veut utiliser CETTE solution est beaucoup plus facile que d'utiliser rvm. Je ne me soucie vraiment pas d'avoir différentes versions de ruby, je veux juste exécuter des programmes shell distribués sous forme de gemmes. Je vous remercie!
Kevin Gimbel
9

En relation (pour les utilisateurs de bundler), si vous voulez une alternative plus légère à RVM qui mettra tout dans un répertoire bien connu spécifique à l'utilisateur, je vous recommande d'utiliser:

bundle install --path $HOME/.gem

si vous souhaitez installer des gemmes au même endroit que

gem install --user-install GEMNAME

les installera, .gem/ruby/RUBYVERSIONdans votre homedir. (Voir l'autre commentaire sur cette question sur--user-install .)

Cela rendra les gemmes visibles gem list, désinstallables via gem uninstall, etc. sans avoir besoin d' sudoaccès. Les scripts exécutables installés par gem ou bundler peuvent être placés dans votre chemin en ajoutant

$HOME/.gem/ruby/RUBYVERSION/bin

à votre $PATH. gemlui-même vous en informe s'il n'est pas défini lorsque vous le faites gem install --user-install.

Todd Vierling
la source
Merci pour cela. Est-il possible de faire en sorte que bundler fasse cela par défaut? (Et si oui, serait-ce une bonne idée?)
joshtch
6
sudo gem install --no-user-install <gem-name>

installera votre gem globalement , c'est-à-dire qu'il sera disponible dans tous les contextes de l'utilisateur.

Tasos Koutoumanos
la source
1
Il peut également écraser une gemme installée par le fournisseur, que ce système d'exploitation pourrait s'attendre à être définie sur une version spécifique. Et cela pourrait casser le code qui en dépend.
The Tin Man
1
... ou il pourrait installer une gemme qu'un fournisseur ne fournit pas, et le faire de manière à la rendre disponible à tous les utilisateurs d'un système. Il est légèrement aggravant que toutes les réponses supposent partout le lecteur est un dev v / sa sysadmin qui en fait ne veulent faire une version spécifique d'un petit bijou disponible à tous les utilisateurs. : D
dannysauer
1

Vous pouvez installer des gemmes dans un dossier spécifique (exemple de fournisseur /) dans votre application Rails en utilisant:

bundle install --path vendor
Chadi
la source
Ce. De nos jours, le seul programme qui devrait avoir besoin de sudo pour installer le logiciel est votre gestionnaire de paquets.
tjbp