如何将capistrano阶段放入子目录?

时间:2017-01-27 16:03:38

标签: ruby-on-rails capistrano capistrano3

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

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

set :stage_config_path, 'cap/stages'

但是我需要它在config / deploy中递归查看,而不是只在该文件夹中查找。

如果我甚至可以做以下事情,那就太好了。

$ cap group1/stage1 deploy

我如何在Ruby on Rails应用程序中完成此操作?

1 个答案:

答案 0 :(得分:2)

我能够覆盖一些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