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

问题描述 投票:1回答:1

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

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

set :stage_config_path, 'cap/stages'

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

如果我甚至可以做以下事情那将是很好的:

$ cap group1/stage1 deploy

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

ruby-on-rails capistrano capistrano3
1个回答
3
投票

我能够覆盖一些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
© www.soinside.com 2019 - 2024. All rights reserved.