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