Включая рейк-задачи в драгоценных камнях

1) Есть ли "лучшее" место для рейк-задач внутри драгоценных камней? Я видел их в /tasks,/lib/tasks, и я видел их как *.rb и *.rake - не уверен, что (если есть) является "правильным"

2) Как сделать их доступными для приложения, как только камень будет настроен в среде?

Ответ 1

В Rails 3 вы делаете это через Railties. Вот код, чтобы сделать это для драгоценного камня, который я только что сделал:

class BackupTask < Rails::Railtie
  rake_tasks do
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f }
  end
end

Итак, вы в основном создаете класс, который наследуется от Rails:: Railtie, тогда в этом классе у вас есть блок rake_tasks, который загружает соответствующие файлы. Вы должны загрузить вместо запроса, если хотите использовать расширение .rake.

Я обнаружил, что мне нужно указать полный путь к Dir (отсюда и гимнастика File.join). Если бы я просто хотел явно указать файл, я мог бы просто сказать "load" tasks/foo.rake ", потому что lib-каталог моего gem находился в пути загрузки.

Ответ 2

Либо /tasks, и lib/tasks - хорошее место. Я использую /tasks, когда задачи предназначены для использования для работы или управления самим Gem, я использую lib/tasks, когда задачи предназначены для загрузки пользователями Gem.

Это связано с тем, что у пользователей может возникнуть проблема с загрузкой рубиновых файлов вне папки lib, которая автоматически добавляется к пути загрузки, когда требуется Gem.

Кроме того, я предлагаю вам использовать расширение *.rake. В настоящее время почти каждая среда IDE связывает расширение .rake с рубиновыми файлами, и большинство продвинутых IDE могут даже анализировать содержимое как графические скрипты. Расширение .rake является лучшим выбором для разработчиков, потому что вы можете обеспечить немедленный обзор содержимого внутри файла.

О вашем втором вопросе, в настоящее время нет способа, чтобы Rails загружала ваши рейк-задачи, когда плагин упакован как Gem. Вам необходимо включить файл рейка в ваше приложение (в другом файле рейка или в основной файл Rakefile) или клонировать задачи рейка в вашем проекте.

Если вы устанавливаете плагин в папке поставщика, все *.rake файлы в обеих задачах и каталоги lib/tasks автоматически загружаются в область Rails двумя следующими строками.

Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext }

Ответ 3

для поддержки Rails 3, верхняя строка вашего файла lib/.rb может быть:

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)

для поддержки Rails 2, установщик gem должен будет отредактировать свой Rakefile и добавить:

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }

после инструкций require.

ПРИМЕЧАНИЯ:

  • Обязательно замените имя своего фактического драгоценного камня.
  • Это предполагает, что все Rake-видимые задачи rake находятся в lib/tasks/

Я еще ничего не нашел. Комментарии?