2014-06-23 15 views
2

我已經追加了一個my_checks方法調用到rails db:migrate調用。下面的代碼很好,只要db:migrate不會引發異常。但是,如果db:migrate確實會拋出異常,則my_checks方法將不會執行。確保附加代碼Rake任務得到運行無論如何

有沒有一種方法可以重寫下面的代碼,以確保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 

編輯

我會做這樣的:

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 

EDIT 2

好了,試試:

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 

編輯3

好吧,這應該工作,並且更加簡單:從一條建議https://www.ruby-forum.com/topic/61010

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']) 

使用at_exit由已故的吉姆·韋裏奇。

有關enhance的更多信息,請參閱http://ruby-doc.org/stdlib-1.9.3/libdoc/rake/rdoc/Rake/Task.html

+0

我真的很希望有一個解決方案,不會涉及到包裝rails db:migrate任務。這是一個好方法,但這需要我的同事改變工作流程,並調用'db:my_migrate'而不是'db:migrate'。我一直希望避免這:) – Reck

+0

@Reck,看我的編輯2. –

+0

只是試了一下。不幸的是,它似乎並不奏效。發生了什麼事情是rails'db:migrate'運行,後面跟着編輯2代碼的':migrate'任務中定義的代碼。但是,由於我使rails'db:migrate'引發了一個異常,代碼定義在:migrate任務沒有達到。這是比預期更加困難:/ – Reck