2017-01-27 25 views
1

По умолчанию этапы capistrano размещены в /config/deploy/. Здесь у меня много этапов. Я также хотел бы, чтобы некоторые из моих сцен сгруппированы, как /config/deploy/group1/ и /config/deploy/group2. Как включить несколько путей?Как я могу разместить этапы capistrano в подкаталоге?

Я заметил, что вы могли бы установить это:

set :stage_config_path, 'cap/stages' 

Но мне нужно искать рекурсивно в конфиге/развернуть вместо только в этой папке.

Было бы хорошо, если бы я мог сделать даже такие вещи, как:

$ cap group1/stage1 deploy 

Как бы идти о выполнении этого в моем Ruby, Rails по применению?

ответ

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