¿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 ).

pje
fuente
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.

Martin Thiede
fuente
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'
edap
fuente
29

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

Jurrah
fuente
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é")

Henry Collingridge
fuente
¿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.

Victor Moroz
fuente