Укрепление глобальных экологических задач

В приложении я обновляюсь с Rails 3.2.22.4 в Rails 4.0.13следующий блок кода для улучшения задачи глобальной среды стал дорожным блоком из-за отсутствия работы с целевой версией Rails:

Rails.application.class.rake_tasks do                                              
  Rake::Task["environment"].enhance do                                             
    ...                                                  
  end                                                                              
end 

Это прекрасно работает на 3.2, но терпит неудачу с Don't know how to build task 'environment' сообщение об ошибке в 4.0,

В 3.2 Rails.application.class.rake_tasks возвращает Proc object ([#<Proc:0x007f978602a470@.../lib/rails/application.rb:301>]) указывая на эту строку в базе кодов рельсов. На 4.0 он возвращает пустой массив.

Линия, упомянутая выше Proc object кажется, будет удален в этом коммите.

Какой предпочтительный способ усилить environment грабли задача быть в Rails 4.x?

Приведенный выше фрагмент кода находится в lib/subdomain/rake.rb файл, и он включает в себя следующий код в lib/subdomain/engine.rb:

module Subdomain
  class Engine < Rails::Engine

    ...
    rake_tasks do |_app|
      require 'subdomain/rake'
    end
    ...
  end
end

Rake-задачи не могут быть выполнены, так как команда завершается с этой ошибкой. rails server|console Команды работают нормально.

1 ответ

Решение

Опция 1

Если я правильно понимаю вопрос, что-то вроде этого должно работать, поместив эти задачи в стандартном месте, как lib/tasks/environment.rake, Примечание. Ничто из этого не относится конкретно к Rails.

# Re-opening the task gives the ability to extend the task
task :environment do
  puts "One way to prepend behavior on the :environment rake task..."
end

task custom: :environment do
  puts "This is a custom task that depends on :environment..."
end

task :environment_extension do
  puts "This is another way to prepend behavior on the :environment rake task..."
end

# You can "enhance" the rake task directly too
Rake::Task[:environment].enhance [:environment_extension]

Выход этого будет:

$ rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a custom task that depends on :environment...

Вариант 2

Однако остается вопрос, почему :environment нужно было продлить. Если это вызвать что-то раньше, скажем, db:migrateвам может быть лучше просто заново открыть заданную задачу и добавить еще одну зависимость к этой конкретной задаче. Например:

task custom: :environment do
  puts "This is a custom task that depends on :environment..."
end

task :custom_extension do
  puts "This is a new dependency..."
end

# Re-opening the task in question allows you to added dependencies
task custom: :custom_extension

Результат этого:

$ rake custom
This is a new dependency on :custom
This is a custom task that depends on :environment...

CCC-Combo Breaker!!

Объединяя все, результат будет выглядеть так:

$  rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a new dependency on :custom
This is a custom task that depends on :environment...
Другие вопросы по тегам