有没有办法在Capistrano3中禁用某些before
/ after
挂钩?
例如,我想为我的(Rails)应用程序部署代码,但我不想在第一次部署时启动应用程序。 (也许这不是“理想的”,但我可能不想这样做有很多原因。)
我知道以下选项:
deploy.rb
文件中运行的任务,例如Rake::Task['deploy:compile_assets'].clear_actions
。require
中删除相应的Capfile
语句,例如# require 'capistrano/rails/assets'
。我想要的是能够调用特定任务或将一些命令行标志传递给cap [stage] deploy
。我想要做的与deploy:setup
大致相同,但Capistrano3中没有该任务。
这样做的最佳方式是什么?
答案 0 :(得分:2)
选项1:使用ENV开关禁用require语句
正如您已经提到的,删除require
语句是获取您正在寻找的结果的最简单方法。为了能够在命令行上控制它,我将使用ENV选项,如下所示:
# In Capfile
# Include tasks from other gems included in your Gemfile
unless ENV["CAP_DISABLE_PLUGINS"]
require "capistrano/bundler"
require "capistrano/rails"
# etc.
end
然后运行:
CAP_DISABLE_PLUGINS=1 cap production deploy
选项2:定义自定义任务
要对运行的任务进行更细粒度的控制,请定义自定义任务。
如果使用cap [stage] deploy
选项运行--trace
,您将看到正在调用的所有任务的调试输出。查看该输出并确定您需要哪些任务以及要跳过哪些任务。然后将您的选择组合成一个自定义任务。
例如,这应该部署您的代码并将其符号链接到current
,但是跳过运行bundler
,编译资产或迁移数据库:
# Place this in config/deploy.rb
namespace :deploy do
task :setup do
invoke "deploy:check"
invoke "deploy:new_release_path"
invoke "git:create_release"
invoke "deploy:set_current_revision"
invoke "deploy:symlink:shared"
invoke "deploy:symlink:release"
invoke "deploy:log_revision"
end
end
然后运行:
cap production deploy:setup