2009-06-04 2 views
13

J'ai récemment transformé un couple de mes plugins en sous-modules et j'ai réalisé que lorsque vous "git clone" un dépôt, le sous-module sera vide. Cela a du sens pour les co-développeurs d'initialiser leurs sous-modules et de les mettre à jour. Cependant, lorsque je déploie avec capistrano, le code du sous-module ne sera évidemment pas déployé, ce qui cause des problèmes. Je pourrais aller dans la branche release et init et mettre à jour le module là-bas, mais ce n'est évidemment pas une solution idéale.Comment gérez-vous le déploiement d'applications de rails avec des sous-modules?

Est-ce que quelqu'un a des suggestions sur la façon de gérer cela? Est-ce aussi simple qu'une tâche capistrano?

Je suis un peu du côté de la production.

Merci!

Répondre

12

Selon this recent thread, Capistrano devrait pouvoir initialiser et mettre à jour vos sous-modules:

set :git_enable_submodules,1 

dans doit être suffisamment config/deploy.rb, si vos .gitmodules entrées sont à jour.
Vous pouvez avoir besoin de to patch Capistrano (lib/capistano/recipes/deploy/scm/git.rb) pour vous assurer que vos sous-modules sont bien inclus.

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 

Si vous avez nested submodules, vous devez:

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

juste besoin au moment de votre configuration de déploiement:

require 'Capistrano/deepmodules'

La gemme s'occupera de tout le reste automatiquement.
Vous pouvez supprimer :git_enable_submodules de votre config, la gem ne fait pas attention à elle - si vous le souhaitez, vous êtes déjà en train de dire que vous voulez activer les sous-modules.

Et encore un détail à faire attention - pour l'instant seule la stratégie de cache à distance est supportée par la gemme. Cela signifie que vous devez ajouter à votre config la ligne suivante:

set :deploy_via, :remote_cache 

Il permet à la cache à distance et il est vraiment la chose que vous voulez faire de toute façon - déployer un grand codebases avec beaucoup de sous-modules et autres stuff est vraiment une expérience gênante si vous n'avez pas de cache côté serveur de celui-ci.

5

set :git_enable_submodules, 1 sur son propre n'a pas fonctionné sans cette option:

set :deploy_via, :remote_cache` 

Cela ne semble pas être documenté nulle part et m'a pris un certain temps pour comprendre. Il est généralement bon d'avoir cette option de toute façon, même sans sous-modules.

5

Avec this commit, Capistrano prend en charge les sous-modules Git et l'option --recursive intégrée.Pour activer le support de Git, ajoutez à votre fichier deploy.rb:

set :git_enable_submodules, true

Et si vous utilisez recursive Git submodules, ajoutez ainsi:

set :git_submodules_recursive, true

Questions connexes