code

Rails의 기본 레이크 작업 재정의

codestyles 2020. 11. 1. 18:08
반응형

Rails의 기본 레이크 작업 재정의


rake db:test:prepare작업 의 기능을 재정의하려는 Rails 2.2 프로젝트가 있습니다 . 나는 이것이 효과가 있다고 생각했지만 그렇지 않습니다.

#lib/tasks/db.rake
namespace :db do
  namespace :test do
    desc "Overridden version of rails' standard db:test:prepare task since the schema dump used in that can't handle DB enums"  
    task :prepare => [:environment] do
      puts "doing db:structure:dump"
      Rake::Task['db:structure:dump'].invoke
      puts "doing db:test:clone_structure"
      Rake::Task['db:test:clone_structure'].invoke
    end   
  end
end

나는 표준 작업의 행동을 얻습니다. 작업 이름을로 변경 :prepare2한 다음을 수행 rake db:test:prepare2하면 제대로 작동합니다. 여기에서 내린 자연스러운 결론은 내 레이크 작업이 내장 된 Rails 작업 보다 먼저 정의되고 있으므로 내 레이크 작업이 표준 :prepare작업으로 재정의된다는 것입니다.

누구든지 내가 이것을 고칠 수있는 방법을 볼 수 있습니까? 새 작업을 사용하는 것보다 차라리 재정의하고 싶습니다. 감사합니다, 최대


이미 존재하는 레이크 작업을 정의하면 해당 실행이 원래 작업의 실행에 추가됩니다. 두 작업이 모두 실행됩니다.

작업을 재정의하려면 먼저 원래 작업을 지워야합니다.

Rake::Task["db:test:prepare"].clear

rake에서 작업이 실행되면 다시 호출하더라도 다시 실행되지 않는다는 점에 유의하는 것도 유용합니다. 이것은 의도적으로 설계된 것이지만 .reset작업을 다시 실행하도록 요청할 수 있습니다 .


자신의 작업을 추가하기 전에 기본 작업을 제거해야합니다.

Rake.application.instance_variable_get('@tasks').delete('db:test:prepare')
namespace 'db' do
  namespace 'test' do
    task 'prepare' do
      # ...
    end
  end
end

상당히 인기있는 관용구 라고하는 편리한 메소드 만드는 것입니다 remove_task과 같이를 :

Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end
end

def remove_task(task_name)
  Rake.application.remove_task(task_name)
end

( 출처 :drnic/newgem )


lib / tasks /에project.rake 파일을 만들고 코드 아래에 붙여 넣습니다.

namespace :mv do
desc "Display hint and info for your rails 4 project"
task info: :environment do
    puts 'Run rake test to test'
end
end

task(:default).clear.enhance ['mv:info']

Krasimir Angelov의 블로그에서 영감을 얻었습니다.

참고 URL : https://stackoverflow.com/questions/8112074/overriding-rails-default-rake-tasks

반응형