2009-06-04 14 views
13

Recientemente convertí un par de mis complementos en submódulos y me di cuenta de que cuando "git clone" un repositorio, el directorio del submódulo estará vacío. Esto tiene sentido para los codesarrolladores para inicializar sus submódulos y actualizarlos.¿Cómo maneja la implementación de aplicaciones de rieles con submódulos?

Sin embargo, cuando implemente con capistrano, obviamente no se implementará el código del submódulo, lo que causa problemas. Podría entrar en la rama de lanzamiento e iniciar y actualizar el módulo allí, pero obviamente no es una solución ideal.

¿Alguien tiene sugerencias sobre cómo manejar esto? ¿Es tan simple como una tarea capistrano?

Soy un poco novato en cuanto a la producción.

¡Gracias!

Respuesta

12

Según this recent thread, Capistrano debe ser capaz de init y actualizar sus submódulos:

set :git_enable_submodules,1 

en config/deploy.rb debería ser suficiente, si sus .gitmodules entradas están al día.
Puede necesitar to patch Capistrano (lib/capistano/recipes/deploy/scm/git.rb) para asegurarse de que sus submódulos se incluyan.

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 tiene nested submodules, es necesario:

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

sólo requieren que a su configuración de despliegue:

requieren 'Capistrano/deepmodules'

La gema se encargará de todo el resto automáticamente.
Puede eliminar :git_enable_submodules de su configuración, la gema no le presta atención; si lo está requiriendo, ya está diciendo que quiere habilitar submódulos.

Y un detalle más a tener en cuenta: por el momento, solo la estrategia de memoria caché remota es compatible con la gema. Esto significa que debe agregar a su config la siguiente línea:

set :deploy_via, :remote_cache 

que permite que el caché remota y es realmente lo que quiere hacer de todos modos - el despliegue de grandes bases de código con una gran cantidad de submódulos y otros cosas es realmente una experiencia problemática si no tienes un caché del lado del servidor.

5

set :git_enable_submodules, 1 por sí mismo no funcionó sin esta opción:

set :deploy_via, :remote_cache` 

Esto no parece ser documentada en cualquier lugar y me tomó un tiempo para averiguar. En general, es bueno tener esa opción de todos modos, incluso sin submódulos.

5

Con this commit, Capistrano tiene soporte tanto para los submódulos de Git como para la opción recursiva incorporada.Para habilitar el soporte de Git submódulos, añadir esto a su archivo deploy.rb:

set :git_enable_submodules, true

Y si utiliza recursive Git submodules, añadir esto también:

set :git_submodules_recursive, true

Cuestiones relacionadas