2009-10-17 8 views
54

Me he encontrado dos veces en esta situación: instalo una gema en mi sistema y empiezo a utilizarla en mi proyecto de Rails. Eventualmente necesito hacer algunos cambios a esa gema. ¿Cómo debo proceder?Bifurcar una gema para un proyecto de Rails

Idealmente me gustaría verificar el código fuente de esa gema en alguna parte, como ~/third_party/gems, trabajar en ello y hacer que mi proyecto Rails lo use en su lugar. ¿Es eso posible?

En todos los casos, las gemas estaban en github, así que probablemente lo haría en github, lo cloné, tendría posibilidades y mantendría mi propia sucursal. Supongo que entonces instalaría esa rama directamente con gem install en mi servidor. ¿Tiene sentido?

+0

Construyendo gemas en GitHub se está eliminando. http://github.com/blog/515-gem-building-is-defunct –

Respuesta

92

Hoy en día esto es bastante fácil de hacer con Bundler. Haces una copia local de la gema y entonces, en lugar de hacer

gem "whatever" 

en su Gemfile, que hace:

gem "whatever", :path => "/home/pupeno/whatever" 

Después de ejecutar bundle install, la gema es tomado de ese directorio. Incluso si modifica algo allí, todo lo que necesita hacer para volver a cargarlo es reiniciar Rails.

Si necesita implementar una aplicación utilizando sus propios cambios de una joya, se hace un tenedor, en Github o similar y en la Gemfile lo hace:

gem "whatever", :git => "[email protected]:/pupeno/whatever.git" 

y eso es todo. Es simple, directo y hermoso.

+2

Esto es útil, porque en algunos casos, hay una gema que está obsoleta, o tiene una funcionalidad que quiero usar como punto de observación. Gracias. –

+0

¡Solución muy útil! – RubyFanatic

+16

Sugiero usar la URL pública de git. 'git: // github.com/pupeno/whatever.git' en lugar de private (' [email protected]: pupeno/whatever.git') en caso de que otras personas usen su proyecto y no tengan acceso privado a su repo –

5

En todos los casos las gemas estaban en github, así que probablemente lo haría en github, lo cloné, tendría posibilidades y mantendría mi propia sucursal. Supongo que entonces instalaría esa rama directamente con gem install en mi servidor.

Si realmente necesita hackear la fuente real de la gema, entonces sí, esa sería la manera de hacerlo. Sin embargo, debería ser un último recurso. No desea mantener la gema real si no es necesario. ¿Por qué no extender las clases desde la fuente de gemas cuya funcionalidad necesita cambiar y utilizar sus clases en lugar de las clases de gemas en su código de Rails?

Me parece raro que realmente necesite hackear código de terceros directamente para hacer lo que necesita hacer. Un buen software puede ampliarse/aumentarse fácilmente.

Cuestiones relacionadas