2012-09-02 23 views
20

Al usar bundler con un proyecto en general y Rails específicamente, solo tiene acceso a las gemas definidas en su Gemfile. Si bien esto tiene sentido, puede ser limitante. En general, me resulta limitado cuando quiero usar un determinado formateador RSpec que el resto del equipo no usa. A menos que esté en el Gemfile, no es accesible.¿Cómo usar gemas que no están en un Gemfile cuando se trabaja con bundler?

¿Hay alguna forma de evitarlo o tengo que agregarlo a Gemfile?

Actualización: mi problema no era Bundler sino Spork. Cuando ejecuté RSpec sin Spork, no tuve problemas para usar el formateador que quisiera.

Actualización n. ° 2: parece que usar Bundler sigue siendo la causa del problema. La diferencia entre usar Spork y no usar Spork es que al ejecutar RSpec sin Spork, carga el formateador antes de cargar su proyecto y entrar en el "recinto de seguridad" de Bundler.

Con Bündler:

$ bundle exec irb 
>> require 'fivemat' 
LoadError: cannot load such file -- fivemat 

from (irb):1:in `require' 
from (irb):1 
from /Users/arikfr/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 

Sin Bündler:

$ irb 
>> require 'fivemat' 
=> true 
+0

¿Por qué no se puede añadir a su fivemat gemfile? –

+4

"En general, me resulta limitante cuando quiero usar un determinado formateador RSpec que el resto del equipo no usa". es por eso. También a veces quiero usar gemas que son compatibles con OS/X pero que no son compatibles con Ubuntu (y viceversa). – arikfr

+0

El problema de OS X/Linux se puede resolver en Gemfile inspeccionando la plataforma de Ruby https://github.com/carlhuda/bundler/issues/663#issuecomment-2849045 –

Respuesta

10

Supongo que ninguna de estas respuestas ha sido elegida como correcta porque no hacen un gran trabajo para resolver el problema: tener gemas adicionales que puede usar que de forma predeterminada no requieren ningún cambio en los archivos Ya en el repositorio para lograr. Es decir, no tiene que modificar ningún archivo y no tiene que vivir recordando no verificar sus cambios locales. Así es como lo hago.

La idea es básicamente invertir las dependencias de la respuesta de Holger, de modo que no hay necesidad de modificar el Gemfile compartido. Bundler permite especificar uno which file is to be used as the gemfile, pero extrañamente los métodos documentados do not apparently work with its configuration file and will not be fixed. Hay una característica algo oscurecida de Bundler de que cualquiera de las opciones de configuración se puede establecer en una variable de entorno o pasar en la línea de comando. Ejecutar todos sus comandos como bundle [command] --gemfile [yourgemfile] o BUNDLE_GEMFILE="[yourgemfile]" bundle [command] hará que Bundler lea el archivo gem que desee. Recomiendo usar el enfoque de variable de entorno y crear un alias o exportar la variable para su sesión actual, particularmente porque no pude usar el modificador de línea de comando con el comando "exec".

Por lo tanto, ejecuto rspec de esta manera: BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename], y tengo la primera parte de este alias como bem en mi bashrc. Funciona de maravilla.

Luego, debe configurar su control de fuente para ignorar su Gemfile, ya sea en el proyecto .gitignore o, para mantener el proyecto totalmente higiénico sin cambiar incluso su .gitignore, a su archivo de ignorar global personal (que es por defecto en ~/.config/git/ignore y tiene el mismo formato que el archivo gitignore de un proyecto).

Otra cosa a tener en cuenta es que Bundler creará un archivo de bloqueo basado en el nombre del Gemfile. Esto es súper útil, ya que evita que sobrescriba el Gemfile.lock de su proyecto si está registrado, pero también debe ignorar este nuevo archivo de bloqueo. Si su gemfile es Foo.bar, busque Foo.bar.lock.

Por último, se puede hacer algo similar a la sugerencia de Holger en su aduana Gemfile:

source "http://rubygems.org" 
gem "fivemat" 
instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile")) 

y ya está bueno para ir, siempre y cuando recuerde especificar su Gemfile.

+0

Este enfoque es el mejor que conozco, pero desafortunadamente no preserva las versiones de gemas en Gemfile's Gemfile.lock incluido. Me encantaría ver una solución que sí lo hizo. –

+0

Puede actualizar Gemfile.lock (a diferencia de Foo.bar.lock) con 'paquete --gemfile Gemfile' – Ritchie

+0

He creado [este repositorio] (https://github.com/ritchiey/play-nice) que puede copiar y clonar en un directorio ** dentro de ** su aplicación para obtener gran parte de esta funcionalidad. – Ritchie

0

En caso de que todavía decide hacer esto (horrible idea):

Se puede añadir código Ruby a su Gemfile a cargar un ~/.gemfile (o similar) si existe.

Algo así como:

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile") 
+0

Tenía pensamientos similares también, ¿no puedo simplemente: require_relative '~/.gemfile' en lugar de eval? – arikfr

13

En ChiliProject que permiten a los usuarios crear un Gemfile.local que se incluye en el principal Gemfile de la carga. Esto permite a los usuarios especificar gemas adicionales sin tener que cambiar nuestro Gemfile para facilitar las actualizaciones.

Para eso, hemos incluido el siguiente código at the bottom of our Gemfile.

gemfile_local = File.expand_path('Gemfile.local', __dir__) 
if File.readable?(gemfile_local) 
    puts "Loading #{gemfile_local}..." if $DEBUG 
    instance_eval(File.read(gemfile_local)) 
end 

El Gemfile.local sí queda excluido del repositorio a través de .gitignore.

+0

buena y elegante solución! –

+0

¡Esto funcionó perfectamente para mí! Esta debería ser la respuesta aceptada. :) –

+5

En esta solución, 'Gemfile.lock' se ve afectado por' Gemfile.local', por lo que no funcionará para los proyectos donde 'Gemfile.lock' es rastreado por VCS. – user1614572

1

Usted puede usar algo como esto en su Gemfile:

gem 'foo' if ENV['ENABLE_FOO_GEM'] 

A continuación, sólo establece ENABLE_FOO_GEM en su entorno.

export ENABLE_FOO_GEM=1 

La joya será desactivado por defecto, pero fácilmente activado (de forma permanente) por cualquier persona que quiera usarlo.

0

Añadir a .gitignore

Gemfile.local 
Gemfile.local.lock 

agregar al proyecto un archivo Gemfile.local.sample con el siguiente contenido:

# Include gems that are note meant to be part of the project but for development purposes 
# That's why Gemfile.local and Gemfile.local.lock must be git-ignored 

# To use these gems: 
# 1. Create a "Gemfile.local" file (at same level of "Gemfile") 
# 2. Prepend "BUNDLE_GEMFILE=Gemfile.local" before "bundle install" or "bundle exec rails c" and so forth. 

eval_gemfile "./Gemfile" 

group :development, :test do 
    # Suggested gems 
    gem "awesome_print", require:"ap" 
    gem "hirb" 
    gem "pry" 
    gem "pry-byebug" 
    gem "pry-rails" 
    gem "meta_request" 

    # My gems 
    gem "fivemat" 
end 
Cuestiones relacionadas