覆盖 Capistrano 任务

在 Capistrano v2 中重新定义任务时,原始任务将被替换。但是,Capistrano v3 所基于的 Rake DSL 是累加的,这意味着给定以下定义

task :foo do
    puts "foo"
end

task :foo do
    puts "bar"
end

将同时打印 foobar

但也可以完全清除任务,然后从头开始重新定义它。一个 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

Fork me on GitHub