2012-07-19 21 views
5

Estoy trabajando con un equipo de desarrolladores, y todos estamos usando el mismo Gemfile de nuestro repositorio. Debido a que estoy trabajando en una Mac, y otros están usando Ubuntu, también tenemos un archivo Gemfile.local.example en nuestro repositorio que tiene las gemas de notificación adecuadas para cada SO, todas comentadas.¿Cómo puedo usar múltiples Gemfiles para mi aplicación?

No comenté las gemas de mi SO y las guardé como un archivo nuevo, no en el control de la versión, Gemfile.local. Ahora me gustaría que "bundle install" instale gems en ambos archivos.

No puedo encontrar ninguna buena documentación sobre cómo hacer esto.

+2

duplicado Posible de http://stackoverflow.com/questions/7962743/bundler-load-multiple-gemfiles – Conner

Respuesta

5

Estoy de acuerdo que el uso de dos Gemfiles es una mala práctica, y han encontrado una solución que implica la constante RUBY_PLATFORM junto con la bandera platform en mi Gemfile. Esta puede no ser la solución MÁS elegante, pero funciona para mí.

Aquí está una parte de mi código para lectores curiosos:

group :development, :test do 
    # Mac OSX notifications 
    gem 'growl_notify' if RUBY_PLATFORM.downcase.include?("darwin") 
    gem 'growl' if RUBY_PLATFORM.downcase.include?("darwin") 

    # Gnome notifications => aka for Linux 
    gem 'libnotify' if RUBY_PLATFORM.downcase.include?("linux") 

    # Guard-spork doesn't work with windows but it's 
    # awesome for other Operating Systems. 
    gem 'guard-spork' if RUBY_PLATFORM.downcase.include?('darwin') || RUBY_PLATFORM.downcase.include?('linux') 

    # Windows Rubies (RubyInstaller) 
    platforms :mswin, :mingw do 
    # Windows notifications 
    gem 'rb-notifu' 
    end 
end 
7

¿Por qué no tener simplemente un Gemfile y usar cosas como groups o usar el indicador :platform para instalar solo algunas gemas en OS X y otros en Ubuntu?

Parece bastante difícil de manejar tener dos Gemfiles. Puede suministrar el Gemfile para usar al bundle config (man page) si realmente quiere hacer eso, supongo.

+0

Esto es impresionante, yo estaba no está al tanto de la opción de la plataforma. He estado usando condicionales en mi Gemfile con una constante RUBY_PLATFORM. ¡Tan claro! –

+0

El uso de la bandera ': platform' parece ser la solución más elegante, pero parece que 'platform: ruby' hace referencia a OSX y Ubuntu, mientras que 'platform: mswin,: mingw' hace referencia a Windows. Necesito especificar entre OSX y Ubuntu. [Esta página] (http://yopefonic.wordpress.com/2011/06/23/multi-platform-ruby-development-with-bundler/) sugiere el uso de la constante RUBY_PLATFORM. ¿Hay otra manera? – dudeitsdevin90

0

Todos deben estar usando el mismo Gemfile y un maestro Gemfile.lock debe estar circulando también. Al menos este es el ideal.

Recuerde que puede usar Ruby para diferenciar qué secciones están cargadas por Bundle.setup y puede usar grupos para definir cosas que solo son relevantes para una plataforma en particular.

El Gemfile.lock debe representar los requisitos específicos de cómo se implementa la aplicación. Se supone que debe estar en el sistema de control de versiones, por lo que no hay confusión sobre con qué versión se lanzará la aplicación. Si hay problemas con la plataforma aquí, debe tener cuidado con lo que usa y, cuando sea necesario, bloquear las dependencias únicamente al grupo :development.

1

No estoy seguro acerca de la compatibilidad de plataforma cruzada (parece que solo es compatible con OS X), pero las gemas de RVM valdría la pena investigar. Lo uso en mi Mac en el trabajo y funciona muy bien.

RVM me permite crear y usar múltiples configuraciones gemset ejecutando el comando rvm use. Las gemas están instaladas en el gemset que estoy usando actualmente para que no tengas que preocuparte por los conflictos en tu gemset global.

https://rvm.io//

Cuestiones relacionadas