Lo que estamos tratando de hacer es peligroso. Si cada uno de tus Rails Engines también son gemas, entonces también tendrían Gemfiles con otras dependencias, y esas a su vez tendrían otras dependencias, etc. Si permites que Bundler las resuelva, entonces tendrás menos problemas en el tiempo de ejecución.
Así es como lo haría sin ningún tipo de hacks. Recuerde que su Gemfile
es solo código Ruby, y puede tener gemas que no están cargadas de forma predeterminada.
# In your Gemfile, add at the end:
Dir[YOUR_RAILS_ENGINES_SUBFOLDER + "/*/*.gemspec"].each do |gemspec_file|
dir_name = File.dirname(gemspec_file)
gem_name = File.basename(gemspec_file, File.extname(gemspec_file))
# sometimes "-" and "_" are used interchangeably in gems
# for e.g. gemspec_file is "engines/my-engine/my_engine.gemspec"
# dir_name will be engines/my-engine
# gem_name will be my_engine
# Register that engine as a dependency, *without* being required
gem gem_name, :path => dir_name, :require => false
# e.g. this is similar to saying
# gem 'my_engine', :path => 'engines/my-engine', :require => false
end
Ahora tiene todos los motores dinámicos de Rails registrados como dependencias de gemas. Bundler los resolverá, y todas sus subdependencias, para que no tenga que preocuparse por nada. Simplemente ejecute bundle install
una vez antes de ejecutar la aplicación, o cada vez que agregue/elimine cualquier motor en esa carpeta.
Lo bueno es que estas gemas solo se registrarán y no se cargarán. Así que en su código de producción, ahora se puede cargar cualquier joya que elija en tiempo de ejecución simplemente diciendo require <your-engine-name>
Editar: Código adicional comenta
Por curiosidad: ¿podría explicar el uso de los casos? No me queda claro por qué querrías hacer esto. – nathanvda
La idea era tener una aplicación modular Rails que cargara sus módulos en tiempo de ejecución. Quería poner módulos/gemas en el directorio, iniciar la aplicación y ser flexible :) –
Bien, supongo que tiene alguna aplicación genérica de rieles que instala en el sitio del cliente, y en función de algunas opciones (tarifa/licencia), instale los módulos correctos en la carpeta. Pero, ¿qué sucede si solo edita el Gemfile y agrupa la instalación? Es menos trabajo, es más seguro, y la única edición/configuración fue la edición de Gemfile. Esto es lo que hacemos. Recibimos nuestro propio gemserver para nuestras gemas "privadas". Si un módulo está habilitado o deshabilitado, solo editamos el Gemfile, el paquete y reiniciamos. – nathanvda