如何使用子模块部署rails应用程序?

时间:2009-06-04 23:47:41

标签: git plugins capistrano deployment git-submodules

我最近将一些插件转换为子模块,并意识到当你“git clone”一个存储库时,子模块目录将为空。这对于共同开发人员初始化他们的子模块和更新是有意义的。

但是,当我使用capistrano部署时,子模块代码显然不会被部署而导致出现问题。我可以进入发布分支并初始化并更新那里的模块,但这显然不是一个理想的解决方案。

有没有人有关于如何处理这个问题的建议?它是否像capistrano任务一样简单?

我在生产方面有点像菜鸟。

谢谢!

3 个答案:

答案 0 :(得分:12)

根据this recent thread,capistrano应该能够初始化和更新你的子模块:

set :git_enable_submodules,1
如果您的.gitmodules条目是最新的,则config / deploy.rb中的

就足够了 您可能需要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
  

它启用了远程缓存,它实际上是你想要做的事情 - 如果没有服务器端缓存,部署包含大量子模块和其他东西的大型代码库真的是一个麻烦的经历。

答案 1 :(得分:5)

如果没有此选项,

set :git_enable_submodules, 1就无法运行:

set :deploy_via, :remote_cache`

这似乎没有在任何地方记录,并花了我一段时间才弄明白。无论如何,即使没有子模块,通常也可以使用该选项。

答案 2 :(得分:5)

使用this commit,Capistrano支持Git子模块和烘焙的--recursive选项。要启用Git子模块支持,请将其添加到deploy.rb文件中:

set :git_enable_submodules, true

如果你使用recursive Git submodules,也可以添加它:

set :git_submodules_recursive, true