То, что вы пытаетесь сделать, опасно.Если каждый из ваших Rails Engines также является гемом, то у них также будут Gemfiles с другими зависимостями, и у них, в свою очередь, будут другие зависимости, и т. Д. Если вы разрешите Bundler разрешать их, у вас будут меньше проблем во время выполнения.
Вот как бы вы это сделали без всяких взломов .Помните, что ваш Gemfile
- это просто код Ruby, и вы можете иметь гемы, которые не загружаются по умолчанию.
# 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
Теперь у вас есть все ваши динамические движки Rails, зарегистрированные как зависимости гемов.Bundler разрешит их и все их подзависимости, поэтому вам не о чем беспокоиться.Просто запустите bundle install
один раз перед запуском приложения или всякий раз, когда вы добавляете / удаляете какой-либо движок в этой папке.
Хорошо, эти гемы будут просто регистрироваться и не загружаться,Таким образом, в вашем рабочем коде теперь вы можете загрузить любой драгоценный камень, который вы выберете во время выполнения, просто сказав require <your-engine-name>
Редактировать: Дополнительные комментарии к коду