禁用Capistrano3的挂钩?

时间:2015-03-27 20:59:29

标签: ruby-on-rails capistrano capistrano3

有没有办法在Capistrano3中禁用某些before / after挂钩?

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

我知道以下选项:

  1. 禁用我不想在deploy.rb文件中运行的任务,例如Rake::Task['deploy:compile_assets'].clear_actions
  2. 从我的require中删除相应的Capfile语句,例如# require 'capistrano/rails/assets'
  3. 我想要的是能够调用特定任务或将一些命令行标志传递给cap [stage] deploy。我想要做的与deploy:setup大致相同,但Capistrano3中没有该任务。

    这样做的最佳方式是什么?

1 个答案:

答案 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