Pregunta

Quiero congelar una gema específica en mi aplicación Rails.

En Rails 2 había este comando:

rake gems:unpack

No puedo encontrar ese comando en Rails 3.

¿Fue útil?

Solución

No he tenido que hacer esto todavía, pero creo que todo está manejado por bundler.

Cuando crea una nueva aplicación Rails3, las dependencias de Rails se ponen en su Gemfile. Tu puedes correr bundle install para instalarlos. Por defecto, se instalan en su BUNDLE_PATH.

Si desea instalarlos dentro de su aplicación, puede especificar dónde: bundle install vendor/gems.

Otros consejos

Entonces, la respuesta corta es que no.

Cuando modifique su archivo gem y luego ejecute bundle install o bundle update, Bundler maneja la resolución de dependencia para usted y determina las mejores versiones (más nuevas) de cada gema que ha requerido que satisfaga toda la cadena de dependencia (no obtendrá una nueva versión que rompa otra gema en la lista de dependencias, etc.) . Por supuesto, también puede colocar una versión específica, o una especificación '> = 1.2.3' o lo que tiene en el GemFile utilizando la sintaxis familiar de la config.gem Días, y Bundler se asegurará de satisfacer eso también (o no producirá un GemFile.lock si no hay una resolución válida).

Cuando Bundler hace su negocio, crea el archivo gemfile.lock, que (y esto se proporciona que usa solo Bundler para administrar su gema en todas las estaciones de trabajo/entornos/implementaciones) realiza la misma función que congelar todas las gemas que ha requerido . ¡Gratis! (¡Revise este archivo en el control de la versión!) Si su nuevo pasante de desarrollo retira su fuente en una máquina fresca, se necesita uno bundle install Y las mismas versiones exactas de las gemas que ha instalado están en su máquina. Empujar a la implementación y hacer un bundle install --deployment Allí (o más probable, tírelo en su Capfile), y las mismas gemas están instaladas (esta vez en proveedor/paquete, configurable). Bundler se usa en Rails 3 para administrar la carga de todas las gemas, por lo que donde sea que le haya dicho a Bundler que las instale (sea cual sea su normal gem install La ubicación es de forma predeterminada, o BUNDLE_PATH (que se registra en .bundle/config si se instala con bundle install --path=foo de lo contrario), Bundler cargará los correctos, incluso cuando difieren de las gemas del sistema.

No necesita desempacar las gemas y revisarlas en su aplicación, porque no importa: está garantizando que las mismas versiones se llamen independientemente de dónde se instalen, lo que probablemente variará de una máquina a otra de todos modos (.Bundle/ no debe registrarse en el repositorio), entonces, ¿por qué pegar otros 60-80 MB de archivos en su repositorio que nunca cambiará ni usará? (por cierto, es por eso que no recomendaría un bundle install --path=vendor/gems Como se sugirió NFM - No es necesariamente incorrecto, simplemente no hay ningún beneficio sobre el flujo de trabajo de Bundler normal, y ahora su tamaño de repo acaba de ser global).

¡No use la respuesta "recomendada" de NFM!

En su lugar, revise el sitio de Bundler, particularmente la página de implementaciones:http://gembundler.com/deploying.html

El breve resumen es usar versiones específicas en su archivo gem y ejecutar bundle install --deployment En cada sistema de destino, donde necesita las versiones de GEM exactas.

Utilizando el --path La opción instalará las gemas, pero no es realmente lo que quieres hacer. Como dijo Matt Enright, solo blando su SCM con cosas que Bundler puede manejar de manera inteligente en cada entorno objetivo.

Tuve que hacer esto por el despliegue de typus gem en Heroku, ya que no puedes ejecutar un heroku rails generate typus En Heroku, dado, es un sistema de archivos solo de lectura. No quería que todas las gemas pusieran en mi aplicación, solo la que me estaba causando dolor. Estos son los pasos que conducen al éxito:

  1. Crear directorio en app_name/proveor/gems/gem_name (opcional) ... en mi caso/app_name/proveor/gems/typus

  2. Agregue lo siguiente a GemFile (esto le dice a Bundle dónde encontrar y colocar la fuente de gemas):

    gem 'typus' ,: git => 'https://github.com/fesplugas/typus.git' ,: path => "vendor/gems/typus"

  3. Luego, desde su directorio de aplicaciones (esto instala la gema en su aplicación):

    'Gema Desempaquete typus -Target Proveor/Gems/Typus'

  4. después bundle install

  5. Entonces ... en mi caso ... Comprométase y presione al repositorio y luego despliegue en Heroku ... es posible que tenga que ejecutar un heroku rake db:migrate

Asumiendo que ya tienes agalle joya Instalado:

  • $ bundle lock
  • $ git add Gemfile.lock

Puede agrupar la instalación en Dreamhost sin ningún problema. Si está compartido, el entorno ya está configurado para almacenarlos localmente en su directorio de inicio. Si está en un VPS o dedicado, puede ejecutar la instalación de Bundle como root o simplemente agregar esto a su .bash_profile

export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8

Creo que lo que estás buscando es

bundle package

Vea las páginas del hombre aquí:http://gembundler.com/man/bundle-package.1.html

En segundo lugar, la respuesta de Tsega (actualizada por Coreyward). "Paquete de paquete" es la respuesta genérica.

El póster no preguntó si congelar sus gemas. Quería saber cómo. Las respuestas como "simplemente no lo hagas" no son útiles en absoluto. Sí, resultó que su problema específico era un poco diferente a eso, pero si bien el "paquete de paquete" podría haber sido exagerado, todavía resuelve el problema.

He trabajado en muchos sistemas, y en algunos simplemente no tienes acceso completo. Instalar gemas en algunos sistemas no es una opción. Entonces, a menos que los empaques, en general estás jodido. Hay diferentes soluciones para diferentes hosts y sistemas, pero ninguno para algunos.

POD: si necesita modificar la gema, la mejor práctica para hacerlo sería bifurcar el proyecto, hacer el cambio y luego usar el indicador 'git' en Bundler:

git 'some_gem', :git => 'git://github.com/me/my_forked_some_gem.git'

De esta manera, se le notificará cuando se actualice la gema.

El comando que quieres es bundle package que simplemente desempacan las gemas y las dependencias en vendor/cache carpeta.

Pero solo un aviso, el :git => .... El tipo de gemas no se empaquetan. Tienes que hackear una salida para :git => ... gemas relacionadas para empacar.

Instrucciones más limpias para el gem unpack y :path => opción:

Muchos comentarios dicen que no es útil usar la instalación del paquete: proveedor/gemas, pero aquellas personas que usan Dreamhost, debe tener en cuenta que no se puede usar la instalación de Bundle en Dreamhost.

La solución es llevar todas las gemas a la carpeta del proveedor y cargar todo en el directorio Dreamhost.

Hay otras soluciones para dar la vuelta a esto, pero es mucho más complicado de hacer.

Bueno, tengo que modificar ligeramente una de las gemas que necesito. Así que necesito mantenerlo dentro de mi repositorio. Entonces, lo que NFM mencionó es lo que probablemente necesito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top