deploy:initial 在 Capistrano 任务中做了什么

What does deploy:initial do in Capistrano task

我使用 Capistrano 进行部署。我的 Capistrano 任务几乎是从很多博客中引用的。我经常发现以下结构。

namespace :deploy do
  desc 'Say something before Deploy'
  task :initial do
    on roles(:app) do
      before 'deploy:hoge', 'deploy:bazz'
      invoke 'deploy'
    end
  end

  task :hoge do
    on roles(:app) do
      puts "'hello, world'"
    end
  end

  task :bazz do
    on roles(:app) do
      puts "'goodnight, world'"
    end
  end
end

before 'deploy:hoge', 'deploy:bazz'task 语句中做了什么?它不显示任何消息。我认为 before 语句必须在 task 语句之外。

至少在 Capistrano 3.x 中,没有内置 deploy:initial 任务这样的东西。使用该名称声明任务不会做任何特别的事情。

I think before statement must be outside of task statement.

你完全正确。任何 beforeafter 声明都应该在顶层完成,绝不能在 task 块内。

就目前而言,您给出的示例没有任何作用。如果你想在部署开始之前 运行 某个任务,你可以挂接到 deploy:starting 任务,像这样:

before "deploy:starting", "deploy:hoge"

此外,deploy 命名空间也没有什么特别之处。我建议在不同的命名空间中声明您自己的自定义任务,以使它们在视觉上分开。然后,您可以轻松区分内置 Capistrano 任务和自定义任务。

所以我会这样重写这个例子:

namespace :myapp do
  task :hoge do
    on roles(:app) do
      puts "'hello, world'"
    end
  end

  task :bazz do
    on roles(:app) do
      puts "'goodnight, world'"
    end
  end
end

# Invoke hoge and bazz before deployment begins
before "deploy:starting", "myapp:hoge"
before "deploy:starting", "myapp:bazz"

可在 beforeafter 中使用的内置 Capistrano 任务的完整列表可在此处找到:

http://capistranorb.com/documentation/getting-started/flow/