¿Cómo especifico archivos .gem locales en mi Gemfile?


Respuestas:


281

Esta no es estrictamente una respuesta a su pregunta sobre la instalación de .gempaquetes, pero puede especificar todo tipo de ubicaciones gema por gema editando su Gemfile .

Especificar un :pathatributo instalará la gema desde esa ruta en su máquina local.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Alternativamente, al especificar un :gitatributo se instalará la gema desde un repositorio de git remoto.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(Como @JHurrah mencionó en su comentario ).


También para algunos firewalls, el protocolo git puede ser un problema. En tal caso, intentegem "foreman", :git => "https://github.com/pje/foreman.git"
kode

61

Parece que el paquete no puede usar archivos .gem listos para usar. Señalar la ruta: a un directorio que contiene archivos .gem no funciona. Algunas personas sugirieron configurar un servidor de gemas local (geminabox, stickler) para ese propósito.

Sin embargo, lo que encontré que es mucho más simple es usar un "servidor" de gemas local del sistema de archivos: simplemente coloque sus archivos .gem en un directorio local, luego use "gem generate_index" para convertirlo en un repositorio de gemas

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Finalmente apunte a esta ubicación agregando la siguiente línea a su Gemfile

source "file://path/to/repo"

Si actualiza las gemas en el repositorio, asegúrese de regenerar el índice.


66
¡Gracias! Además, necesitaba una tercera barra para hacer "file: /// Absolute / Path / to / repo"
Anna

55
¿No sería más fácil ejecutar el "servidor de gemas" en la línea de comando y agregar la fuente " localhost: 8808 " a su Gemfile
Anna

¡Esto es realmente genial Martin! Gracias por compartir, es exactamente lo que estaba buscando, ya que no quería depender de ejecutar un gem serverservidor ni quería alojar todo el proyecto, solo el archivo .gem.
Leo Gallucci

66
Consejo adicional: puede sortear el requisito de ruta absoluta utilizando File.expand_path de esta manerasource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

No funciona para mi Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon

44

Descomprimiría su gema en la carpeta del proveedor de la aplicación

gem unpack your.gem --target /path_to_app/vendor/gems/

Luego agregue la ruta en el Gemfile para vincular la gema desempaquetada.

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

Por defecto, Bundler verificará su sistema primero y si no puede encontrar una gema, usará las fuentes especificadas en su Gemfile.


Cierto. pero ¿qué pasa si no lo he instalado antes? (cuando estoy implementando en un servidor) No pude encontrar Imlib2-Ruby-0.5.2 en ninguno de los comandos de fuentes terminados
ddayan

184
puede apuntar a un directorio local con gema "gemname",: path => "~ / some / local / path"
JHurrah

55
Creo que: la ruta requiere la carpeta de gemas con el archivo gemspec. Solo tengo archivos .gem que deseo instalar.
ddayan

1
Ok, así que la implementación de la tapa pasó, pero la gema no se instaló "No hay tal archivo para cargar - vips": /
ddayan

44
Eso definitivamente no es cierto, al menos por más tiempo. Bundler no mira las gemas de su sistema, y ​​solo pasa por lo que está en el Gemfile. Una de las razones es tan terrible.
bioneuralnet

6

Puede forzar a bundler a usar las gemas que implemente usando "bundle package" y "bundle install --local"

En su máquina de desarrollo:

bundle install

(Instala las gemas necesarias y crea Gemfile.lock)

bundle package

(Almacena en caché las gemas en proveedor / caché)

En el servidor:

bundle install --local

(--local significa "usar las gemas del vendedor / caché")


¿Qué pasa si no puedo instalar nada en el servidor? En este caso, necesito construir con rake pero el servidor no tiene una gema que uso para construir; pero no tengo problemas para registrar las dependencias.
Henrik

"paquete de instalación" no funcionó para mí si la gema no estaba incluida en mi fuente "Gemfile" existente.
Anna

Simplemente elimine el archivo de gemas de forma temporal antes de hacerlo bundle installDespués de eso, copie el archivo de gemas al proveedor / caché , agregue la gema de nuevo al archivo de gemas y ejecute bundle install --local
bert bruynooghe

1
bundle packageEs una gran sugerencia, incluso ahora, tres años después. Si su versión de Bundler es anterior a la 2.0 (aún no publicada en este escrito), deberá usarla bundle package --allsi desea incluir gemas patho gitdependencias. Sin embargo, le dará un recordatorio útil si detecta tales dependencias.
L2G

1
FYI: esto puede no funcionar tan bien como esperaría si desarrolla en una plataforma diferente a la que implementa (por ejemplo, desarrolle en macOS, implemente en Linux). Según los --localdocumentos: "Tenga en cuenta que si existe una gema específica de plataforma apropiada en rubygems.org, no se encontrará".
Liam Dawson

1

Agregar .gema vendor/cacheparece funcionar. No se requieren opciones en Gemfile.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.