禁用 Capistrano3 的挂钩?

Disable hooks for Capistrano3?

有什么方法可以禁用 Capistrano3 中的某些 before/after 挂钩吗?

例如,我想为我的 (Rails) 应用程序部署代码,但我不想在第一次部署时启动该应用程序。 (也许这不是 "ideal",但有很多原因我可能不想这样做。)

我知道以下选项:

  1. 禁用我不想 运行 作为我的 deploy.rb 文件的一部分的任务,例如 Rake::Task['deploy:compile_assets'].clear_actions.
  2. 从我的 Capfile 中删除适当的 require 语句,例如 # require 'capistrano/rails/assets'.

我想要的是能够调用特定任务或将一些命令行标志传递给 cap [stage] deploy。我想做的和deploy:setup大致相同,但是Capistrano3中没有这个任务。

最好的方法是什么?

选项 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 选项,您将看到正在调用的所有任务的调试输出。查看该输出并决定哪些任务是您需要的,哪些是您想要跳过的。然后assemble将您的选择放入自定义任务中。

例如,这应该部署您的代码并将其符号链接到 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