2009-06-04 48 views
13

我最近把我的一些插件變成了子模塊,並意識到當你「克隆」一個倉庫時,子模塊目錄將是空的。這對於合作開發者初始化其子模塊和更新是有意義的。你如何處理部署rails子應用程序的應用程序?

但是,當我部署capistrano時,子模塊代碼顯然不會引起問題。我可以進入發佈分支並在那裏初始化和更新模塊,但這顯然不是一個理想的解決方案。

有沒有人有關於如何處理這個問題的建議?這與卡皮斯特拉諾的任務一樣簡單嗎?

我是一個在生產方面的小事。

謝謝!

回答

12

this recent thread,Capistrano的應該能夠初始化和更新您的子模塊:

set :git_enable_submodules,1 

在配置/ deploy.rb應該夠了,如果你的.gitmodules條目是最新的。
您可能需要to patch Capistrano (lib/capistano/recipes/deploy/scm/git.rb)以確保您的子模塊包含在內。

def checkout(revision, destination) 
     git  = command 

     branch = head 

     fail "No branch specified, use for example 'set :branch, \"origin/master\"' in your deploy.rb" unless branch 

     if depth = configuration[:git_shallow_clone] 
     execute = "#{git} clone --depth #{depth} #{configuration[:repository]} #{destination} && " 
     else 
     execute = "#{git} clone #{configuration[:repository]} #{destination} && " 
     end 

     execute += "cd #{destination} && #{git} checkout -b deploy #{branch}" 

     if submodules = configuration[:git_enable_submodules] 
     execute += " && git-submodule init &&" 
     execute += "git-submodule update" 
     end 

     execute 
    end 

如果你有nested submodules,您需要:

gem sources -a http://gems.github.com 
$ sudo gem install morhekil-capistrano-deepmodules 

只是要求它在您的部署配置:

需要 'Capistrano的/ deepmodules'

寶石會自動處理所有其他的事情。
您可以從您的配置中刪除:git_enable_submodules,gem不關注它 - 如果您需要它,您已經說過要啓用子模塊。

還有一個要注意的細節 - 目前只有gem支持遠程緩存策略。這意味着你必須添加到您的config以下行:

set :deploy_via, :remote_cache 

它使遠程緩存,它真的是你想反正做的事情 - 有很多子模塊和其它的部署大量的代碼庫如果你沒有服務器端緩存,東西真的很麻煩。

5

set :git_enable_submodules, 1它自己沒有這個選項不工作:

set :deploy_via, :remote_cache` 

這似乎沒有在任何地方記錄和我花了一段時間才能找出。無論如何,即使沒有子模塊,也總是有好的選擇。

5

對於this commit,Capistrano支持Git子模塊和-recursive選項。要啓用Git的子模塊的支持,添加到您的deploy.rb文件:

set :git_enable_submodules, true

如果您使用recursive Git submodules,添加此還有:

set :git_submodules_recursive, true