'sudo gem install' o 'gem install' e posizioni delle gemme


140

L'esecuzione di " sudo gem list --local" e " gem list --local" mi dà risultati diversi. Il mio percorso gemma è impostato sulla mia cartella home e contiene solo le gemme da ' gem list --local'.

Probabilmente non è bene avere gemme installate in diverse directory sul mio computer, quindi dovrei avere il percorso gemma impostato in modo diverso e dovrei sempre usare sudoquando installo qualcosa?

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 è vuoto.


1
Penso che questa sia una domanda valida per quelli di noi che devono usare una gemma che richiede i privilegi di root.
Kelly,

Correlato: stackoverflow.com/questions/21141584/… . Uso rbenv per gestire le versioni di Ruby e ho riscontrato un problema perché l'ho usato al sudo gem install railsposto di gem install rails.
Dennis,

3
"Penso che questa sia una domanda valida per quelli di noi che devono usare una gemma che richiede i privilegi di root." Penso che qualsiasi gemma che abbia bisogno dei privilegi di root, sia da installare, sia da eseguire, sia altamente sospetto. Le gemme dovrebbero essere in grado di funzionare in una sandbox ed eseguire con le autorizzazioni dell'utente.
Tin Man,

1
sudoè una pistola carica puntata verso il piede. Usarlo senza capire cosa fa e come può influenzare il tuo sistema è come premere il grilletto con gli occhi chiusi. Potresti sparare un buco nel piede, potresti non farlo, ma in entrambi i casi non vuoi correre il rischio a meno che tu non sappia come annullare il danno. Utilizzando sudoscrive nel Ruby di proprietà del sistema, che, su Mac OS, è stato installato da Apple per i propri usi. Possiamo fare affidamento su di esso, ma cambiare la cosa sbagliata può rompere il loro codice. Ecco perché installiamo dal sorgente o usiamo qualcos'altro per installare dove possiamo tranquillamente modificarlo.
Tin Man,

Risposte:


146

Contrariamente a tutti gli altri post che suggerisco di NON utilizzare sudodurante l'installazione di gemme.

Invece ti consiglio di installare RVM e iniziare una vita felice con case gemme portatili e diverse versioni di Ruby che vivono tutte sotto lo stesso tetto.

Per i non iniziati, dalla documentazione :

RVM è uno strumento da riga di comando che ci consente di installare, gestire e lavorare facilmente con più ambienti rubini e set di gemme.

Il motivo per cui installare gemme con sudoè peggio che semplicemente gem installè perché installa le gemme per TUTTI GLI UTENTI come root. Questo potrebbe andare bene se sei l'unica persona che utilizza la macchina, ma se non lo sei può causare stranezze.

Se decidi di voler spazzare via tutte le tue gemme e ricominciare, è molto più facile e sicuro farlo come utente non root.

Se decidi di usarlo, l' RVMuso sudocauserà tutti i tipi di stranezze perché ogni versione di Ruby che installi RVMha il suo GEM_HOME.

Inoltre, è bello se riesci a rendere il tuo ambiente di sviluppo il più vicino possibile al tuo ambiente di produzione, e nella produzione molto probabilmente installerai gemme come utente non root.


12
+1 per la rvm suggerisce, ma -1 per la confusa condanna della possibilità alternativa di usare solo sudo
tfwright il

10
Ok, ma tutte le tue ragioni si riducono a "perché RVM è così eccezionale" non perché l'uso di sudo è particolarmente dannoso. L'unica volta che non vorrai è nella situazione specifica in cui ti trovi su un computer condiviso. Se vuoi raccomandare rvm, fallo e basta. Non c'è bisogno di ricorrere a FUDD.
Wright il

6
Cerco di non diffondere FUD, e ho cercato di dare ragioni non-RVM, mi scuso se sembra così.
jonnii,

9
RVM è una buona opzione. Ma dovresti provarne uno migliore, RBENV. È meno invadente di RVM.
Andres,

4
@ HontváriJózsefLevente è difficile rispondere a tutte le tue domande in un commento, ma il punto è che vuoi che il tuo ambiente di sviluppo sia il più vicino possibile alla produzione. se stai lavorando su due app, una delle quali utilizza ruby ​​2.1 e l'altra gli utenti 1.9, dovrai assicurarti che l'ambiente locale stia utilizzando la versione corretta. questo è ciò che RVM o RBENV fa per te. Lo useresti per lo stesso motivo per cui utilizzeresti qualsiasi ambiente sandbox, ma il vantaggio principale in questo caso è l'isolamento. Spero che aiuti!
jonnii,

128

Puoi anche installare gemme nel tuo ambiente locale (senza sudo) con

gem install --user-install <gemname>

Ti consiglio di non confondere la configurazione a livello di sistema anche se si tratta di un computer a utente singolo.

Puoi controllare dove vanno le gemme guardando Gempaths gem environment. Nel mio caso è "~ / .gem / ruby ​​/ 1.8".

Se hai bisogno di alcuni binari delle installazioni locali aggiunti al tuo percorso, puoi aggiungere qualcosa al tuo bashrc come:

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

(da http://guides.rubygems.org/faqs/#user-install )


23
+1 per questa opzione anziché per le soluzioni "Yet Another Configuration Tool" sopra, RBENV / RVM.
jjpe,

Sto creando un gioiello e secondo i manuali che devo fare rake installe per riparare il sudo isse, ho dovuto patchare manualmente l' /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rbaggiunta --user-installlì. Non riesco a trovare una soluzione migliore, perché sembra rake installche non accetta parametri aggiuntivi.
Nakilon,

Sono assolutamente elettrizzato da quel primo comando. Ho cercato di installare gemme e ho riscontrato problemi perché non ho i privilegi di sudo. Quel comando ha funzionato !!!!
Caleb Kleveter,

34

Meglio ancora, inserisci il --user-installtuo file ~ / .gemrc in modo da non doverlo digitare ogni volta

gem: --user-install

13

Nel caso tu

  • gemme di rubino installate con sudo
  • vuoi installare gemme senza sudo
  • non voglio installare rvm / rbenv

aggiungi quanto segue al tuo .bash_profile:

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

Apri una nuova scheda nel Terminale OPPURE source ~/.bash_profilesei pronto!


8
Per qualcuno che non lavora con Ruby, Rails, Rake e qualsiasi altra cosa Ruby Devs usa / vuole usare QUESTA soluzione è molto più semplice dell'uso di rvm. Non mi interessa davvero avere diverse versioni di ruby, voglio solo eseguire alcuni programmi shell distribuiti come gemme. Grazie!
Kevin Gimbel,

9

Correlato (per utenti bundler), se si desidera un'alternativa più leggera a RVM che inserirà tutto in una directory ben nota specifica dell'utente, si consiglia di utilizzare:

bundle install --path $HOME/.gem

se vuoi installare gemme nello stesso posto

gem install --user-install GEMNAME

li installerà, .gem/ruby/RUBYVERSIONnel tuo homedir. (Vedi l'altro commento su questa domanda a riguardo --user-install.)

Ciò renderà le gemme visibili gem list, non installabili tramite gem uninstall, ecc. Senza bisogno di sudoaccesso. Gli script eseguibili installati da gem o bundler possono essere inseriti nel percorso aggiungendo

$HOME/.gem/ruby/RUBYVERSION/bin

al tuo $PATH. gemstesso ti dice questo se non è impostato quando lo fai gem install --user-install.


Grazie per questo. È possibile fare in modo che il bundler lo faccia per impostazione predefinita? (E se fosse così, sarebbe una buona idea?)
joshtch,

6
sudo gem install --no-user-install <gem-name>

installerà la tua gemma a livello globale , cioè sarà disponibile per tutti i contesti dell'utente.


1
Può anche sovrascrivere una gemma installata dal fornitore, che quel sistema operativo potrebbe aspettarsi di essere impostato su una versione specifica. E questo potrebbe rompere il codice che si basa su di esso.
Tin Man,

1
... o potrebbe installare un gioiello che un fornitore non fornisce e farlo in modo da renderlo disponibile a tutti gli utenti su un sistema. E 'leggermente aggravante che tutte le risposte ovunque assumono che il lettore è un dev v / sa amministratore di sistema che in realtà fa vogliono fare una versione specifica di un gioiello a disposizione di tutti gli utenti. : D
dannysauer,

1

Puoi installare gemme in una cartella specifica (esempio fornitore /) nella tua app Rails usando:

bundle install --path vendor

Questo. In questi giorni l'unico programma che dovrebbe aver bisogno di sudo per installare il software è il tuo gestore di pacchetti.
tjbp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.