只需將它包裝在一個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。
我真的很希望有一個解決方案,不會涉及到包裝rails db:migrate任務。這是一個好方法,但這需要我的同事改變工作流程,並調用'db:my_migrate'而不是'db:migrate'。我一直希望避免這:) – Reck
@Reck,看我的編輯2. –
只是試了一下。不幸的是,它似乎並不奏效。發生了什麼事情是rails'db:migrate'運行,後面跟着編輯2代碼的':migrate'任務中定義的代碼。但是,由於我使rails'db:migrate'引發了一個異常,代碼定義在:migrate任務沒有達到。這是比預期更加困難:/ – Reck