'sudo gem install' o 'gem install' y ubicaciones de gemas

140

Ejecutar ' sudo gem list --local' y ' gem list --local' me dan resultados diferentes. Mi ruta de gemas está configurada en mi carpeta de inicio y solo contiene las gemas de ' gem list --local'.

Probablemente no sea bueno tener gemas instaladas en diferentes directorios en mi computadora, entonces, ¿debería tener la ruta de gemas configurada de manera diferente, y debería usarla siempre sudoal instalar algo?

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á vacío.

raphael_turtle
fuente
1
Creo que esta es una pregunta válida para aquellos de nosotros que tenemos que usar una gema que requiere privilegios de root.
Kelly
Relacionado: stackoverflow.com/questions/21141584/… . Utilizo rbenv para administrar versiones de Ruby y me encontré con un problema porque lo usé en sudo gem install railslugar de hacerlo gem install rails.
Dennis
3
"Creo que esta es una pregunta válida para aquellos de nosotros que tenemos que usar una gema que requiere privilegios de root". Creo que cualquier gema que necesite privilegios de root, ya sea para ser instalada o para ejecutarse, es altamente sospechosa. Las gemas deberían poder ejecutarse en un entorno limitado y ejecutarse con los permisos del usuario.
The Tin Man
1
sudoes un arma cargada apuntando hacia tu pie. Usarlo sin comprender lo que hace y cómo puede afectar su sistema es como apretar el gatillo con los ojos cerrados. Puede hacer un agujero en su pie, puede que no, pero de cualquier manera no quiere correr el riesgo a menos que sepa cómo deshacer el daño. Usando sudoescrituras en el sistema propiedad de Ruby, que, en Mac OS, fue instalado por Apple para sus propios usos. Podemos aprovecharlo, pero cambiar lo incorrecto puede romper su código. Es por eso que instalamos desde la fuente o usamos algo más para instalar donde podemos ajustarlo de manera segura.
The Tin Man

Respuestas:

146

Al contrario de todas las otras publicaciones que sugiero NO usar sudoal instalar gemas.

En cambio, le recomiendo que instale RVM y comience una vida feliz con casas de gemas portátiles y diferentes versiones de Ruby, todas viviendo bajo un mismo techo.

Para los no iniciados, de la documentación :

RVM es una herramienta de línea de comandos que nos permite instalar, administrar y trabajar fácilmente con múltiples entornos de rubíes y conjuntos de gemas.

La razón por la cual instalar gemas sudoes peor que simplemente gem installporque instala las gemas para TODOS LOS USUARIOS como root. Esto podría estar bien si eres la única persona que usa la máquina, pero si no lo eres, puede causar rarezas.

Si decide que quiere volar todas sus gemas y comenzar de nuevo, es mucho más fácil y seguro hacerlo como usuario no root.

Si decides que quieres usar RVM , usarlo sudocausará todo tipo de rarezas porque cada versión de Ruby que instales RVMtiene su propio GEM_HOME.

Además, es bueno si puede hacer que su entorno de desarrollo sea lo más cercano posible a su entorno de producción, y en la producción lo más probable es que instale gemas como usuario no root.

jonnii
fuente
12
+1 para la sugerencia de rvm, pero -1 para la condena confusa de la posibilidad alternativa de usar solo sudo
tfwright
10
Ok, pero todas sus razones se reducen a "porque RVM es tan bueno" no porque usar sudo sea especialmente dañino. La única vez que no querrás es en la situación específica en la que estás en una computadora compartida. Si quieres recomendar rvm solo hazlo. No es necesario recurrir a FUDD.
tfwright
66
Intento no difundir FUD, e intenté dar razones que no son RVM, me disculpo si parece así.
jonnii
9
RVM es una buena opción. Pero deberías probar uno mejor, RBENV. Es menos intrusivo que RVM.
Andrés
44
@ HontváriJózsefLevente es difícil abordar todas sus preguntas en un comentario, pero en resumen, desea que su entorno de desarrollo esté lo más cerca posible de la producción. Si está trabajando en dos aplicaciones, una de las cuales usa ruby ​​2.1 y la otra usuarios 1.9, entonces deberá asegurarse de que su entorno local esté usando la versión correcta. eso es lo que RVM o RBENV hace por ti. Lo usaría por la misma razón que usaría cualquier entorno de sandbox, pero el principal beneficio en este caso es el aislamiento. ¡Espero que esto ayude!
jonnii
128

También puede instalar gemas en su entorno local (sin sudo) con

gem install --user-install <gemname>

Lo recomiendo para que no te metas con la configuración a nivel de sistema, incluso si se trata de una computadora de un solo usuario.

Puede verificar a dónde van las gemas mirando gempaths con gem environment. En mi caso es "~ / .gem / ruby ​​/ 1.8".

Si necesita agregar algunos binarios de instalaciones locales a su ruta, puede agregar algo a su bashrc como:

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

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

Nils
fuente
23
+1 para esta opción en lugar de las soluciones anteriores de "Otra herramienta de configuración", RBENV / RVM.
jjpe
Estoy creando una gema y de acuerdo con los manuales que tengo que hacer rake instally para arreglar el sudo isse, tuve que parchear manualmente la /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rbadición --user-installallí. No puedo encontrar una mejor solución, porque parece rake installque no acepta parámetros adicionales.
Nakilon
Estoy absolutamente encantado con ese primer comando. He estado tratando de instalar gemas y he tenido problemas porque no tengo privilegios de sudo. ¡Ese comando funcionó!
Caleb Kleveter
34

Mejor aún, --user-installingrese su archivo ~ / .gemrc para que no tenga que escribirlo cada vez

gem: --user-install
allyraza
fuente
13

En el caso que tú

  • gemas de rubí instaladas con sudo
  • querer instalar gemas sin sudo
  • no quiero instalar rvm / rbenv

agregue lo siguiente a su .bash_profile:

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

¡Abre una nueva pestaña en la Terminal OR source ~/.bash_profiley listo!

David Salamon
fuente
8
Para alguien que no trabaja con Ruby, Rails, Rake, y cualquier otra cosa que Ruby Devs use / quiera usar ESTA solución es mucho más fácil que usar rvm. Realmente no me importa tener diferentes versiones de ruby, solo quiero ejecutar algunos programas de shell distribuidos como gemas. ¡Gracias!
Kevin Gimbel
9

Relacionado (para usuarios de paquetes), si desea una alternativa más ligera a RVM que coloque todo en un directorio conocido específico del usuario, le recomiendo usar:

bundle install --path $HOME/.gem

si quieres instalar gemas en el mismo lugar que

gem install --user-install GEMNAME

los instalará .gem/ruby/RUBYVERSIONen tu homedir. (Vea el otro comentario sobre esta pregunta sobre --user-install).

Esto hará que las gemas sean visibles gem list, desinstalables gem uninstall, etc. sin necesidad de sudoacceso. Los scripts ejecutables instalados por gem o bundler se pueden poner en su camino agregando

$HOME/.gem/ruby/RUBYVERSION/bin

a tu $PATH. gemsí mismo le informa sobre esto si no está configurado cuando lo hacegem install --user-install .

Todd Vierling
fuente
Gracias por esto. ¿Es posible hacer que bundler haga esto por defecto? (Y si es así, ¿sería una buena idea?)
joshtch
6
sudo gem install --no-user-install <gem-name>

instalará su gema globalmente , es decir, estará disponible para todos los contextos de usuario.

Tasos Koutoumanos
fuente
1
También puede sobrescribir una gema instalada por el proveedor, que ese sistema operativo podría esperar establecer en una versión específica. Y eso podría romper el código que se basa en él.
The Tin Man
1
... o podría instalar una gema que un proveedor no proporciona, y hacerlo de manera que esté disponible para todos los usuarios de un sistema. Está ligeramente agravante de que todas las respuestas en todas partes asumen el lector es un dev v / sa administrador de sistemas que realmente hace falta para hacer una versión específica de una gema a disposición de todos los usuarios. : D
dannysauer
1

Puede instalar gemas en una carpeta específica (ejemplo proveedor /) en su aplicación Rails usando:

bundle install --path vendor
Chadi
fuente
Esta. En estos días, el único programa que debería necesitar sudo para instalar el software es su administrador de paquetes.
tjbp