覆盖 Capistrano 任务
在 Capistrano v2 中重新定义任务时,原始任务将被替换。但是,Capistrano v3 所基于的 Rake DSL 是累加的,这意味着给定以下定义
task :foo do
puts "foo"
end
task :foo do
puts "bar"
end
将同时打印 foo
和 bar
。
但也可以完全清除任务,然后从头开始重新定义它。一个 Rake::Task
提供了 clear
方法,该方法在内部执行三个独立的操作
clear_prerequisites
clear_actions
clear_comments
但是,清除先决条件(即可能为任务定义的任何依赖项)可能不是您想要的。例如,假设您想重新定义 deploy:revert_release
任务,该任务定义如下
task :revert_release => :rollback_release_path do
# ...
end
对该任务调用 clear
然后重新定义它会导致 rollback_release_path
永远不会被调用,从而破坏回滚行为。
在大多数情况下,您只需使用 clear_actions
,它会删除指定任务的行为,但不会改变其依赖项或注释
task :init do
puts "init"
end
task :foo => :init do
puts "foo"
end
Rake::Task["foo"].clear_actions
task :foo do
puts "bar"
end
运行 foo
任务将打印
init
bar