2009-06-04 3 views
13

Ich habe kürzlich ein paar meiner Plugins in Submodule umgewandelt und festgestellt, dass das Submodul-Verzeichnis leer ist, wenn Sie ein Repository "git clone" erstellen. Dies ist für Mitentwickler sinnvoll, um ihre Submodule zu initialisieren und zu aktualisieren.Wie handhaben Sie die Implementierung von Rails-Anwendungen mit Submodulen?

Allerdings, wenn ich mit capistrano bereitstellen, wird der Submodul-Code offensichtlich nicht bereitgestellt, was Probleme verursacht. Ich könnte in den Release-Zweig gehen und dort das Modul init und updaten, aber das ist natürlich keine ideale Lösung.

Hat jemand Vorschläge, wie man damit umgeht? Ist es so einfach wie eine Capistrano-Aufgabe?

Ich bin ein bisschen ein Anfänger auf der Produktionsseite der Dinge.

Vielen Dank!

Antwort

12

Nach this recent thread sollte Capistrano Lage sein, Ihre Submodule init und aktualisieren:

set :git_enable_submodules,1 

in config/deploy.rb genug sein sollte, wenn Ihr .gitmodules Einträge auf dem neuesten Stand sind.
Sie müssen möglicherweise to patch Capistrano (lib/capistano/recipes/deploy/scm/git.rb), um sicherzustellen, dass Ihre Submodule obwohl einbezogen werden.

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 

Wenn Sie nested submodules haben, müssen Sie:

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

benötigen Sie es einfach bei der Bereitstellung config:

require 'Capistrano/deepmodules'

Der Edelstein kümmert sich automatisch um den Rest.
Sie können :git_enable_submodules aus Ihrer Konfig löschen, das Juwel beachtet es nicht - wenn Sie es benötigen, sagen Sie bereits, dass Sie Submodule aktivieren möchten.

Und ein weiteres Detail zu beachten - im Moment nur Remote-Cache-Strategie wird durch den Edelstein unterstützt. Es bedeutet, dass Sie Ihre config die folgende Zeile hinzufügen:

set :deploy_via, :remote_cache 

Es ermöglicht die Remote-Cache und es ist wirklich das, was Sie ohnehin tun wollen - großen Codebases mit vielen Submodule Bereitstellung und andere Zeug ist wirklich eine lästige Erfahrung, wenn Sie keinen serverseitigen Cache davon haben.

5

set :git_enable_submodules, 1 auf seine eigene Arbeit nicht ohne diese Option:

set :deploy_via, :remote_cache` 

Dies schien nicht überall zu dokumentieren und dauerte eine Weile, um herauszufinden. Es ist generell gut, diese Option auch ohne Submodule zu haben.

5

Mit this commit unterstützt Capistrano sowohl Git Submodule als auch die Option --recursive backed in.So aktivieren Sie Git Submodule Unterstützung, fügen Sie diese zu Ihrer deploy.rb Datei:

set :git_enable_submodules, true

Und wenn Sie recursive Git submodules verwenden, fügen Sie dies auch:

set :git_submodules_recursive, true

Verwandte Themen