【问题标题】:How can I place capistrano stages into a sub-directory?如何将 capistrano 阶段放入子目录?
【发布时间】:2017-01-27 16:03:38
【问题描述】:

默认情况下,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】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2018-09-29
      • 1970-01-01
      • 2011-03-24
      • 2010-09-06
      • 2021-12-27
      相关资源
      最近更新 更多