2011-09-07 17 views
12

Tengo una aplicación Sinatra que requiere otra gema que estoy desarrollando localmente. Tengo problemas para configurar Bundler para usar mi código de gema local durante el desarrollo, pero mi código de gema que se vende está en producción.¿Cómo se puede configurar Bundler/Gemfile para usar diferentes fuentes de gemas durante el desarrollo?

Lo ideal sería que pudiera hacer algo como esto, pero Bündler no permitirá especificar la misma joya dos veces:

# Doesn't work: 
group :development do 
    gem 'awesome', :path => "~/code/awesome" 
end 

group :production do 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

Mientras tanto he recurrido a vendoring manualmente la gema & la actualización de la fuente de la gema en el Gemfile cada vez que lo despliego, lo cual es bastante complicado. Mi flujo de trabajo es la siguiente:

  1. punto a mi joya local durante el desarrollo (gem 'awesome', :path => "~/code/awesome")
  2. Cuando esté listo para implementar, joya de desempaquetado en vendor/gems
  3. actualización Gemfile para señalar a vendored joya (gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. Run bundle install (para actualizar Gemfile.lock) código
  5. Implementar
  6. Volver al paso 1.

¡Qué molestia! Me gustaría hacer algo más simple que simplemente escribir tareas de Rake para automatizar mi configuración actual.

Cuál es la mejor flujo de trabajo para este escenario?

Respuesta

2

Al parecer, puede utilizar Rubí regular en su Gemfile. De acuerdo con this article puede establecer una variable de entorno (o cualquier otra variable, he encontrado), que le permita elegir la versión de la gema que desea usar.

## based on an ENV variable 
if ENV['RACK_ENV'] == "development" 
    gem 'awesome', :path => "~/code/awesome" 
else 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

Quizás eso funcione. Si necesita vender su gema en progreso, tal vez podría hacer un pequeño script que establecerá el ENV, lo vendrá y restablecerá el ENV. Eh?

+0

Intenté lo que este artículo sugiere anteriormente, y en su mayor parte está bien. El problema es que cuando impleno, Gemfile.lock se refiere a mi gema local (vea sus dos últimos ejemplos de código). Supongo que podría instalar gemas de producción localmente y luego implementar o excluir Gemfile.lock de git por completo ... pero no estoy seguro de que ninguna de esas opciones sea el mejor método. –

+0

Sí, quiero lograr lo mismo, pero parece que no hay una forma clara de hacerlo. –

13

Hay una nueva característica que permite hacer eso, simplemente specyfing local.gem_name opción de configuración, como:

bundle config local.rack ~/path/to/local/rack 

Esto sólo funciona si la gema tiene un repositorio git y la rama especificada en el Gemfile.

Ver thr docs Bundler para más detalles: http://bundler.io/v1.3/bundle_config.html

-3

Aquí es una sugerencia que no he tenido que trabajar a fondo (utilizado para un tema de juerga y tengo problemas con algunas hojas de estilo del tema):

group :production do 
     gem 'gemname', '~> 0.1.6', :git => 'git://github.com/foouser/gemname.git' 
end 

group :development do 
     gem 'gemnamedev', :path => '~/path/gemname' # use local version 
end 

Duplica tu archivo gemname.gemspec y llámalo gemnamedev.gemspec, y cambia s.name dentro de él por "gemnamedev".

+0

esto no funcionará. Bundler te da un error al decir que no puedes tener dos gemas de diferentes fuentes – jakecraige

Cuestiones relacionadas