그냥 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을 참조하십시오.
레일즈'db : migrate' 작업을 래핑하지 않아도 될 솔루션을 기대하고있었습니다. 이것은 좋은 접근 방법이지만 동료들에게 워크 플로를 변경하고 db : migrate 대신에 db : my_migrate를 호출해야합니다. 나는 이것을 피하기를 바랬다 : – Reck
@Reck, 내 편집 2를 보아라. –
그냥 시도해 보았다. 불행히도 그것은 작동하지 않는 것 같습니다. 무슨 일이 일어나고있는 지 레일'db : migrate'가 실행되고 편집 2에서 코드의': migrate' 태스크에 정의 된 코드가 이어집니다. 그러나 레일즈'db : migrate'가 예외를 던지기 때문에 코드 : migrate 태스크에 정의 된 이름에 도달하지 않습니다. 이것은 예상보다 어려워지고 있습니다./ – Reck