2014-06-23 1 views
2

my_checks 메서드 호출을 db:migrate 호출에 추가했습니다. 아래 코드는 db:migrate이 예외를 throw하지 않는 한 훌륭하게 작동합니다. 그러나 db:migrate이 예외를 throw하면 my_checks 메서드가 실행되지 않습니다.레이크 작업에 추가 코드가 무엇이든 상관없이 실행되도록하십시오.

my_checks이 실행될 때 어떤 문제가 발생하지 않도록 아래 코드를 다시 작성할 수있는 방법이 있습니까? db:migrate?

namespace :db do 
    def my_checks 
    ... 
    end 

    task :migrate do 
    my_checks 
    end 
end 

답변

3

그냥 begin/rescue/ensure/end 문에 포장 :이처럼 할 것

namespace :db do 
    def my_checks 
    ... 
    end 

    task :migrate do 
    begin 
     # something that may raise error 
    rescue 
     # what to do if error, you can omit this if you don't care about error 
    ensure 
     my_checks 
    end 
    end 
end 

편집 : 2

좋아

namespace :db do 
    def my_checks 
    ... 
    end 

    task :my_migrate do 
    begin 
     Rake::Task['db:migrate'].invoke 
    rescue 
     # what to do if error, you can omit this if you don't care about error 
    ensure 
     my_checks 
    end 
    end 
end 

편집, 시도 :

def alias_task(name, old_name) 
    # from https://gist.github.com/raggi/232966 
    t = Rake::Task[old_name] 
    desc t.full_comment if t.full_comment 
    task name, *t.arg_names do |_, args| 
    # values_at is broken on Rake::TaskArguments 
    args = t.arg_names.map { |a| args[a] } 
    t.invoke(args) 
    end 
end 

alias_task 'db:old_migrate', 'db:migrate' 

namespace :db do 

    def my_checks 
    puts 'ok' 
    end 

    task :migrate do 
    begin 
     Rake::Task["db:old_migrate"].execute 
    ensure 
     my_checks 
    end 
    end 
end 

EDIT 3

좋아,이 작동, 그리고 훨씬 더 간단합니다 : https://www.ruby-forum.com/topic/61010에서 후반 짐 웨이 리치에 의해 제안에서 at_exit

namespace :db do 

    def my_checks 
    puts 'ok' 
    end 

    task :other do 
    at_exit { my_checks } 
    end 
end 

Rake::Task['db:migrate'].enhance(['db:other']) 

사용.

enhance에 대한 자세한 내용은 http://ruby-doc.org/stdlib-1.9.3/libdoc/rake/rdoc/Rake/Task.html을 참조하십시오.

+0

레일즈'db : migrate' 작업을 래핑하지 않아도 될 솔루션을 기대하고있었습니다. 이것은 좋은 접근 방법이지만 동료들에게 워크 플로를 변경하고 db : migrate 대신에 db : my_migrate를 호출해야합니다. 나는 이것을 피하기를 바랬다 : – Reck

+0

@Reck, 내 편집 2를 보아라. –

+0

그냥 시도해 보았다. 불행히도 그것은 작동하지 않는 것 같습니다. 무슨 일이 일어나고있는 지 레일'db : migrate'가 실행되고 편집 2에서 코드의': migrate' 태스크에 정의 된 코드가 이어집니다. 그러나 레일즈'db : migrate'가 예외를 던지기 때문에 코드 : migrate 태스크에 정의 된 이름에 도달하지 않습니다. 이것은 예상보다 어려워지고 있습니다./ – Reck

관련 문제