¿Cómo puedo especificar una gema local en mi Gemfile?

Respuestas:

541

Creo que puedes hacer esto:

gem "foo", path: "/path/to/foo"
Jimmy Cuadra
fuente
10
Una ruta codificada está bien para una sesión rápida de pirateo, pero la solución de gemas locales de bloudermilk es más efectiva para proyectos bajo control de versiones. Le permite seguir revisando ambos proyectos, gema y proyecto usando la gema, de modo que otros no tengan que verificar la fuente de gemas o compartir los mismos caminos.
mahemoff
44
Puede hacer esto un poco más limpio mediante el uso de un enlace simbólico .gitignored a su joya local en el directorio de su proyecto, de esa manera puede usar el control de origen en ambos proyectos por separado y otros pueden hacer lo mismo sin tener una estructura de directorio idéntica.
Dan
77
Algo a tener en cuenta podría ser la primavera. Si está utilizando una ruta local para su gema, podría notar versiones en caché de su gema local como lo hice en la consola de rails. Si no parece que se están recogiendo los cambios de gemas locales, intente spring stopver si realmente es el problema.
Jason R
1
Agregar la ruta de la gema local a config / spring.rb parece ayudar a recoger los cambios de la gema local después de reiniciar la consola / servidor de rails.
Jason R
55
Mucho
Cyzanfar
230

Además de especificar la ruta (como mencionó Jimmy), también puede obligar a Bundler a usar una gema local para su entorno solo mediante la siguiente opción de configuración:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Esto es extremadamente útil si está desarrollando dos gemas o una aplicación de gemas y rieles una al lado de la otra.

Sin embargo, tenga en cuenta que esto solo funciona cuando ya está usando git para su dependencia, por ejemplo:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Como se ve en los documentos .

leche azul
fuente
Tengo problemas con esto porque estoy usando BUNDLE_PATH(compilando un paquete para distribución). Al hacer lo que sugirió, o la respuesta de Jimmy, solo hace una using, y en realidad no se instala en mi BUNDLE_PATHcarpeta. No pude resolver esto, ¿alguna ayuda?
Automático
2
Tenga en cuenta que esto no funcionará con una gemspec , por discusión aquí .
davetapley
31
Para deshabilitar la anulación local:bundle config --delete local.GEM_NAME
alxndr
Tuve que eliminar la directiva de versión de la línea de gemas para que esto funcione.
Epigene
44
Si desea utilizar una rama diferente en el desarrollo de la producción, también debe configurarla bundle config disable_local_branch_check trueo Bundler se quejará de la rama. Sin embargo, tenga cuidado con esto, ya que se supone que las comprobaciones detendrán las confirmaciones incorrectas Gemfile.lock. Documentos aquí: bundler.io/v1.12/git.html
Leo
33

También puede hacer referencia a una gema local con git si está trabajando en ella.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Entonces, si cambia, corro

bundle exec gem uninstall foo
bundle update foo

Pero no estoy seguro de que todos necesiten ejecutar estos dos pasos.

Rimian
fuente
55
esto es genial, pero no es tan conveniente si está desarrollando activamente la gema ... porque necesitará comprometer cada cambio y bundle uninstall <gem> && bundle install , por cada cambio que desee reflejado en su aplicación
Ramses
18

Para utilizar el repositorio de gemas local en un proyecto Rails, siga los pasos a continuación:

  1. Compruebe si su carpeta de gemas es un repositorio git (el comando se ejecuta en la carpeta de gemas)

    git rev-parse --is-inside-work-tree
  2. Obteniendo la ruta del repositorio (el comando se ejecuta en la carpeta de gemas)

    git rev-parse --show-toplevel
  3. Configurar una anulación local para la aplicación de rieles

    bundle config local.GEM_NAME /path/to/local/git/repository

    donde GEM_NAMEestá el nombre de tu gema y /path/to/local/git/repositoryes la salida del comando en el punto2

  4. En su aplicación Gemfileagregue la siguiente línea:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Correr bundle installdebería dar algo como esto:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    donde GEM_NAMEestá el nombre de tu gema y /path/to/local/git/repositorydesde el punto2

  6. Finalmente, corre bundle list, no, gem listy deberías ver algo como esto:

    GEM_NAME (0.0.1 5a68b88)

    donde GEM_NAMEesta el nombre de tu gema


Algunos casos importantes que estoy observando usando:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Parece RubyMineque no muestra gemas locales como una biblioteca externa. Puede encontrar más información sobre el error aquí y aquí
  • Cuando estoy cambiando algo en la gema local, para poder cargarlo en la aplicación de rieles, debería stop/startel servidor de rieles
  • Si estoy cambiando la versiongema, stopping/startingel servidor Rails me da un error. Para solucionarlo, estoy especificando la versión de gema en la aplicación de rieles de Gemfileesta manera:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
gotqn
fuente
0

Puede hacer referencia a gemas con fuente: source: 'https://source.com', git repository (:github => 'git/url')y con ruta local :path => '.../path/gem_name'.
Puede obtener más información sobre Gemfiles y cómo usarlos en este artículo.

Nesha Zoric
fuente
-4

Si quieres la rama también:

gem 'foo', path: "point/to/your/path", branch: "branch-name"
C Johnson
fuente
Esto no funciona, genera un error: Only gems with a git source can specify a branch.
KenB