如何将 Capistrano 阶段放入子目录中?

How can I place capistrano stages into a sub-directory?

默认情况下,capistrano 阶段位于 /config/deploy/。我这里有很多阶段。我还想将我的一些阶段分组为 /config/deploy/group1//config/deploy/group2。如何包含多个路径?

我注意到你可以这样设置:

set :stage_config_path, 'cap/stages'

但我需要它以递归方式查看 config/deploy 而不是仅在该文件夹中查看。

如果我能做这样的事情就好了:

$ cap group1/stage1 deploy

我如何在我的 Ruby on Rails 申请中完成这个?

我能够重写一些 Capistrano 方法来让它工作。我在 Capfile 的顶部写了以下代码:

module Capistrano
  module DSL
    module Stages

      def stages
        names = Dir[stage_definitions].map { |f| "#{File.dirname(f)}/#{File.basename(f, ".rb")}".gsub("#{stage_config_path.to_s}/", '') }
        assert_valid_stage_names(names)
        names
      end

      # Override stage_definitions to include subfolders
      def stage_definitions
        stage_config_path.join("**/*.rb")
      end
    end
  end
end

说明

通过覆盖 #stage_definitions 方法,我添加了 **/ 它会在子目录中查找 .rb 文件。

下一个问题是 capistrano/setup.rb 有这行代码:

load stage_config_path.join("#{stage}.rb")

这意味着我需要 stage 来包含文件夹名称。然后我覆盖 #stages 以便 names 变量将是阶段数组,包括子目录(如果有)。示例:

config/
├── deploy/
│   ├── group_1/
|   ├──   ├── stage1.rb
│   ├── stage2.rb
│   ├── stage3.rb

变为:

['group_1/stage1', 'stage2', 'stage3']

这允许创建 Rake 任务并正确加载文件!

$ cap group_1/stage1 deploy