2011-04-23 20 views
8

En el Gemfile de mi proyecto Rails, estoy empezando a tener gemas auxiliares como "ruby-debug19", "perftools.rb", o "irbtools". Todos estos realmente no tienen nada que ver con el proyecto, sino que son parte de mi configuración de desarrollo local. Pero dado que estoy usando bundler, no puedo cargar estas gemas (aunque estén instaladas en todo el sistema) a menos que las agregue al Gemfile. En mi opinión, es un poco un olor a código.Bypassing bundler para desarrollo auxiliar gemas

Por ejemplo, me gustaría poder require 'irbtools' en rails console sin agregar "irbtools" a mi Gemfile.

¿Hay alguna manera de mantener las gemas auxiliares fuera del Gemfile y aún así poder cargarlas para la depuración, creación de perfiles, etc. cuando las necesito?

Respuesta

3

En realidad, se puede crear un group en que Gemfile gustan:

group :auxiliary do 
    gem 'irbtools' 
end 

y luego usar bundle install --without auxiliary si no desea utilizar irbtools. ¿Por qué crees que agregarlos a Gemfile es un olor a código? Y si es posible hacerlo sin agregar gemas al Gemfile, creo que habrá muchos más códigos.

+0

Buena idea. Todavía me pregunto si hay una manera de mantener esas gemas auxiliares fuera de mi Gemfile por completo. (La razón por la que creo que es un olor a código es que no tienen nada que ver con la aplicación en absoluto. Simplemente reflejan mis preferencias como desarrollador.) –

+1

Por cierto, si no quieres editar tu 'Gemfile' principal, puedes crear el tuyo propio y cargarlo cuando lo necesites:' bundle install --gemfile YourGemfile' –

0

No estoy seguro si esto funcionaría para usted. Depende de si está usando RVM o no. Si es así, puede instalar esas gemas auxiliares en el gemset @global que se crea automáticamente para cada intérprete de Ruby. Las gemas en el gemset @global están disponibles para todas las gemas de proyectos específicos de forma predeterminada. De esta forma no necesitarás ordenar tus Gemfiles.

2

Puse el siguiente código en un archivo en la raíz de mi aplicación, por lo que es fácil de cargar desde irb.

Si lo desea, en algo así como un servidor de rieles, es probable que tenga que añadir la declaración load a environments/development.rb etc. Eso todavía crea problemas si entra accidentalmente de que en, pero es menos molesto que tener que añadirlo a la Gemfile y haciendo que tu Gemfile.lock también cambie.

# Example usage: 
# add_more_gems("ruby-debug-base19-0.11.26", "linecache19-0.5.13") 
# or 
# add_more_gems(%w(ruby-debug-base19-0.11.26 linecache19-0.5.13)) 
# 
# Note that you are responsible for: 
# - adding all gem dependencies manually 
# - making sure manually-added gem versions don't conflict with Gemfile.lock 
# To list deps, run e.g. "gem dep ruby-debug-base19 -v 0.11.26" 
# 
def add_more_gems(*gem_names_and_vers) 
    gem_names_and_vers.flatten! 
    gem_base = File.expand_path(Gem.dir) 

    gem_names_and_vers.each do |gem_name_and_ver| 
    # uncomment if desired 
    ###puts "Adding lib paths for #{gem_name_and_ver.inspect}" 
    spec_file = File.join(gem_base, 'specifications', "#{gem_name_and_ver}.gemspec") 
    spec = Gem::Specification.load spec_file 
    this_gem_dir = File.join(gem_base, 'gems', gem_name_and_ver) 
    spec.require_paths.each {|path| 
     dir_to_add = File.join(this_gem_dir, path) 
     $: << dir_to_add unless $:.member?(dir_to_add) 
    } 
    end 
end 

# put your often-used gems here 
add_more_gems(
    %w(
    ruby-debug-base19-0.11.26 
    ruby-debug-ide19-0.4.12 
    linecache19-0.5.13 
) 
) 
+0

Ojalá fuera parte del framework de Rails. – JellicleCat

3

Gracias a this post Tengo una gran solución.

  1. añadir esta línea al final de su Gemfile:

    eval(File.read(File.dirname(__FILE__) + '/Gemfile.local'), binding) rescue nil 
    
  2. crear un archivo llamado Gemfile.local.

  3. Agregue sus gemas de desarrollo a Gemfile locales. Por ejemplo:

    group :development do 
        gem 'cucumber' 
    end 
    
  4. Agregue Gemfile.local a .gitignore.

Ahora puede agregar sus gemas de desarrollo auxiliar sin cambiar el Gemfile para otras personas en el equipo. Muy genial.

Cuestiones relacionadas