我使用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
语句之外。
答案 0 :(得分:0)
至少在Capistrano 3.x中,没有内置deploy:initial
任务这样的东西。使用该名称声明任务并没有什么特别之处。
我认为
before
语句必须在任务声明之外。
你是完全正确的。任何before
和after
声明都应该在顶层进行,而不是在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"
您可以在此处找到可与before
和after
一起使用的内置Capistrano任务的完整列表: