¿Cuál es la mejor manera de desinstalar gemas de un proyecto de rails3?

102

Instalé todas mis gemas usando bundler a través de Gemfile. Pensé (erróneamente) que si borraba una gema de mi Gemfile y ejecutaba 'instalación de paquete', las gemas eliminadas se desinstalarían. He mirado el archivo de ayuda del paquete y, por lo que puedo decir, no tiene forma de desinstalar gemas.

¿Solo uso gem uninstall x para todo? ¿Esto va a confundir al paquete?

lashleigh
fuente

Respuestas:

136

Bundler se inicia desde el directorio raíz de su aplicación, por lo que se asegura de que todas las gemas necesarias estén presentes para que su aplicación funcione.Si por alguna razón ya no necesita una gema, tendrá que ejecutar el

    gem uninstall gem_name 

como dijiste anteriormente Entonces, cada vez que ejecutes el paquete, volverá a verificar las dependencias

EDITAR - 24.12.2014

Veo que la gente sigue llegando a esta pregunta. Decidí agregar algo. La respuesta que di fue para el caso en el que mantienes tus gemas a nivel mundial. Considere usar un administrador de gemas como rbenv o rvm para mantener los conjuntos de gemas dentro del alcance de proyectos específicos.

Esto significa que no se instalarán gemas a nivel global y, por lo tanto, cuando elimine una del Gemfile de su proyecto y vuelva a ejecutar el paquete, obviamente, no se cargará en su proyecto. Luego, puede ejecutar bundle clean (con el directorio del proyecto) y eliminará del sistema todas las gemas que una vez se instalaron de su Gemfile (en el mismo directorio) pero en este momento dado ya no se enumeran allí ... En pocas palabras: elimina las gemas no utilizadas.

Daniel
fuente
98

Esto desinstalará una gema instalada por el paquete:

bundle exec gem uninstall GEM_NAME

Tenga en cuenta que esto arroja

ERROR: Mientras se ejecuta gem ... (NoMethodError) método indefinido `delete 'para # <Bundler :: SpecSet: 0x00000101142268>

pero la gema se quita realmente. La próxima vez que ejecute bundle installla gema se reinstalará.

phatmann
fuente
10
Para usuarios de RVM: debe utilizar este método si ha configurado un conjunto de gemas para su proyecto en particular. Ejecutar gem uninstall pgdesde la carpeta del proyecto desinstalará pg de su conjunto de gemas de nivel global / sistema en lugar del paquete del paquete
Eric Hu
¿Es este el error al que te refieres? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833
+1 por hacerlo en el contexto del paquete. ¡Ojalá no arrojara ese error! mejor aún, me gustaría poder empaquetar -f actualizar gemname.
pduey
2
@EricHu no si está utilizando el conjunto de gemas RVM. Siempre que instale una gema con gem install xxx dentro de un conjunto de gemas RVM, ahí es donde se queda, por lo que hacer una simple desinstalación de gemas xxx en un conjunto de gemas RVM eliminará la gema instalada en ese conjunto de gemas y no en la del sistema.
Esteban Feldman
@EstebanFeldman tiene razón, creo que este fue un cambio realizado en RVM en los últimos 11 meses.
Eric Hu
21

Con las versiones más recientes de bundler, puede usar la tarea limpia:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

editar:

Esto no se recomienda si está utilizando un conjunto de gemas global (es decir, todos sus proyectos mantienen sus gemas en el mismo lugar). Sin embargo, hay algunas formas de mantener separadas las gemas de cada proyecto:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installcon cualquiera de las siguientes opciones: --deploymento --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
fuente
El uso bundle clean --forceeliminó un montón de gemas que no uso en mi proyecto actual, pero sí uso en mis otros proyectos. ¿Se suponía que debía establecer un camino? Simplemente bundle cleandevuelve "Solo se puede usar la limpieza de paquetes cuando se establece --path o --force". Pero la --pathopción ni siquiera aparece en la ayuda.
Dennis
1
Eso es correcto @Dennis. La cleantarea realmente no tiene sentido si está utilizando un conjunto de gemas global. Pero si lo desea, cada uno de sus proyectos puede tener sus gemas separadas. Puede hacerlo a través de rvm gemsets ( rvm.io/gemsets/basics ), o especificando la ruta de las gemas a través de la --pathopción de bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
1

Debe usar 'gem uninstall gem_name' para desinstalar una gema.

Tenga en cuenta que si instaló la gema en todo el sistema (es decir, la instalación del paquete sudo), es posible que deba especificar el directorio binario usando la opción -n, para asegurarse de que se eliminen los binarios que pertenecen a la gema. Por ejemplo

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Declan McGrath
fuente
1

Me pareció que resolví esto eliminando manualmente la gema de unicornio a través del paquete ("sudo bundler exec gem uninstall unicorn"), luego reagrupando ("sudo bundle install").

Sin embargo, no estoy seguro de por qué sucedió, aunque la solución anterior parece funcionar.

Aaron Marks
fuente
1

Si quieres limpiar todas tus gemas y empezar de nuevo

sudo gem clean
Douglas G. Allen
fuente