Загрузка драгоценного камня во время выполнения в Rails 3 - PullRequest
9 голосов
/ 13 декабря 2011

У меня есть приложение Rails 3.0.x.Я хотел бы загрузить драгоценные камни во время выполнения, без использования Gemfile.

Чего я хотел бы добиться, так это загрузить свое приложение, как обычно, с обычными гемами, загружаемыми Bundler.После этого я хотел бы загрузить все гемы (Rails Engines), расположенные в определенном каталоге (но до времени выполнения, я не знаю, какие это будут гемы).

Кто-нибудь знает, возможно ли это в Rails?, может быть, с помощью Bundler API?

Ответы [ 2 ]

6 голосов
/ 16 июня 2013

То, что вы пытаетесь сделать, опасно.Если каждый из ваших 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>

Редактировать: Дополнительные комментарии к коду

0 голосов
/ 13 декабря 2011

Попробуйте это:

Bundler.with_clean_env do
  # require gems...
end
...