traduccion ruby rubygems bundler

ruby - traduccion - ¿Cómo usar gemas que no se encuentran en un Gemfile cuando se trabaja con bundler?



bundler ruby (5)

Añadir a .gitignore

Gemfile.local Gemfile.local.lock

Agregue 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

Cuando se utiliza 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. Principalmente lo encuentro limitado cuando quiero usar un cierto formateador RSpec que el resto del equipo no usa. A menos que esté en el Gemfile, no es accesible.

¿Alguna forma de evitarlo o tengo que agregarlo a Gemfile?

Actualización: mi problema no era Bundler sino Spork. Al ejecutar RSpec sin Spork no tuve ningún problema en utilizar el formateador que quisiera.

Actualización # 2: parece que el uso de Bundler sigue siendo la causa del problema. La diferencia entre usar Spork y no usar Spork, es que cuando se ejecuta RSpec sin Spork, se carga el formateador antes de cargar su proyecto y entrar en el "sandbox" de Bundler.

Con Bundler:

$ 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 Bundler:

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


En ChiliProject permitimos a los usuarios crear un Gemfile.local que se incluye en el Gemfile principal en 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 en la parte inferior de nuestro 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 se excluye del repositorio a través de .gitignore .


En caso de que aún decidas hacer esto (idea horrible):

Puede agregar código ruby ​​a su Gemfile para cargar un archivo ~ / .gem (o similar) si existe.

Algo como:

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


Puedes usar algo como esto en tu Gemfile:

gem ''foo'' if ENV[''ENABLE_FOO_GEM'']

Luego solo establece ENABLE_FOO_GEM en tu entorno.

export ENABLE_FOO_GEM=1

La gema se deshabilitará de forma predeterminada, pero cualquier persona que quiera usarla podrá encenderla (de forma permanente).


Supongo que ninguna de estas respuestas se ha elegido como correcta porque no solucionan el problema de manera adecuada: al tener gemas adicionales que puede usar, no se requieren cambios en los archivos que ya están en el repositorio para lograr . Es decir, no tiene que modificar ningún archivo, y no tiene que vivir recordando no registrar 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 es necesario modificar el Gemfile compartido. Bundler permite que se especifique qué archivo se utilizará como archivo gem , pero, al parecer , los métodos documentados no funcionan con su archivo de configuración y no se solucionarán . Hay una característica un tanto oscura de Bundler que permite configurar cualquiera de las opciones de configuración en una variable de entorno o pasarla a la línea de comandos. Ejecutar todos sus comandos como bundle [command] --gemfile [yourgemfile] o BUNDLE_GEMFILE="[yourgemfile]" bundle [command] hará que Bundler lea cualquier archivo de gema que desee. Recomiendo encarecidamente utilizar el enfoque de la variable de entorno, y crear un alias o exportar la variable para su sesión actual, especialmente porque no pude usar el interruptor de línea de comando con el comando "exec".

Por lo tanto, ejecuto rspec así: 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 origen para ignorar su Gemfile, ya sea en el .gitignore del proyecto o, para mantener el proyecto completamente higiénico sin cambiar incluso su .gitignore, a su archivo de ignorar global personal (que está predeterminado 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 archivo Gemfile. Esto es súper útil, ya que evita que se sobrescriba el archivo Gemfile.lock de su proyecto si está registrado, pero también debe ignorar este nuevo archivo de bloqueo. Si su archivo gem es Foo.bar , busque Foo.bar.lock .

Finalmente, puede hacer algo similar a la sugerencia de Holger en su Gemfile personalizado:

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

y está listo para irse, siempre y cuando recuerde especificar su Gemfile.