Загружайте rake-файлы и запускайте задачи из других файлов

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

Поскольку я перешел с PHP, у меня есть только очень базовые знания о Ruby/Rake, и я не могу запустить действие по умолчанию для пространства имен после загрузки файла.

Закомментированная Rake :: Task ...-строка внутри app:init выдает мне ошибку в CL:

rake aborted! 
uninitialized constant TASK

Вот пространство имен/класс (если это правильное слово).

task :default => [ 'app:init' ]
namespace :app do

    rake_dir   = "#{Dir.pwd}/assets/rake/"
    rake_files = FileList.new( "#{rake_dir}*" )

    desc "Loads rake modules (Default action)"
    task :init do
        puts "\t Importing rake files for processing"

        puts "\t loading..."
        rake_files.each() { |rake|
            puts "\t #{rake}"
            require rake
            # @link rubular.com
            name = rake.split( rake_dir ).last.gsub( /.rb\z/, '' )
            puts "\t #{name}"
            #Rake :: Task[ "#{name}:default" ].invoke
        }
    end
end

Заранее спасибо.

Редактировать: По крайней мере, я могу быть уверен, что файл загрузится, так как простое puts "file loaded" в начале этих файлов повторяется. Проблема кажется только в том, что действие :default для пространства имен в загруженном файле rake не загружается.


person kaiser    schedule 07.12.2012    source источник


Ответы (3)


Вы можете либо поместить свои задачи в папку rakelib/, которую rake загружает по умолчанию, либо добавить определенную папку в свой Rakefile через:

Rake.add_rakelib 'lib/tasks'
person splattael    schedule 06.02.2015
comment
Никогда об этом не знал. Спасибо! - person Andrew; 22.09.2015
comment
Одно улучшение: можно упомянуть, что отдельные файлы можно легко загружать с помощью load "file.rb". Тогда это должен быть принятый ответ. - person Overbryd; 14.10.2015
comment
Этот ответ должен быть защищен. Я никогда не знал об этом каталоге rakelib/ - person FilBot3; 16.05.2017

Если вашей целью является загрузка задач rake из внешнего файла, вы можете сделать это следующим образом. Во-первых, предположим, что у вас есть задача rake в файле с именем <project>/lib/tasks/hello.rake, которая выглядит так:

desc "Say hello"
task :hello do 
  puts "Hello World!"
end

Затем вы можете создать простой Rakefile в вашем каталоге <project>, чтобы загрузить его следующим образом:

Dir.glob('lib/tasks/*.rake').each { |r| load r}

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

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

load './lib/tasks/hello.rake'

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

Чтобы просмотреть все загруженные задачи, используйте rake -T. Обратите внимание, что я использовал lib/tasks, так как это стандартный подход, применяемый в приложениях Rails. Вы можете использовать assets или что угодно, хотя я предпочитаю lib/tasks даже в проектах, отличных от Rails. Я также склонен разделять свои файлы задач на основе их пространства имен.

person Aaron Massey    schedule 27.05.2013
comment
почему он должен быть загружен, а не требовать? - person Jwan622; 21.06.2018
comment
require является частью собственно Ruby, а load является частью Rake DSL. При этом он не должен быть загружен. Rake предоставляет другие, возможно, более явные способы сделать это. Например: Dir.glob('tasks/**/*.rake').each { |r| Rake.application.add_import r } - person Aaron Massey; 27.06.2018

Вы всегда можете использовать Rake.add_rakelib 'tasks', как сказал @splattael. Вам нужно знать одну вещь: файлы в каталоге «tasks» должны иметь расширение «.rake» вместо «.rb», иначе rake не загрузит их для вас.

Образец файла:

После того, как вы сделаете все вышеперечисленное, используйте rake -T, чтобы проверить свою работу, чтобы убедиться, что rake успешно загрузил ваши задачи.

person Xiao Hanyu    schedule 04.01.2016