2008-11-12 19 views
32

In Standard-PHP- oder Quellcode-basierten Projekten behalten wir einfach den gesamten Code in SVN und jeder Entwickler kann seine eigene Kopie auschecken und mit demselben Code zusammenarbeiten.Drupal Source Control Strategie?

Bei der Entwicklung einer Drupal-Site ist jedoch ein Großteil der Arbeit im "Setup". Neben dem Thema und den Modulen hast du keinen "Quellcode". Wie können Sie mehrere Instanzen derselben Site ausführen, sodass Entwickler gleichzeitig arbeiten und ihre Arbeit freigeben können?

Beispielszenario:

Wir starten eine erste Version einer Drupal-Website mit Content-Type "X" erstellt. Wir starten auch zunächst eine Ansicht auf der Site, die alle Knoten vom Typ "X" in chronologischer Reihenfolge auflistet. Der Client beginnt mit der Verwendung der Website, fügt Inhalte, Menüelemente usw. hinzu.

Die nächste Version soll die Benutzersuchfunktion zu dieser Ansicht hinzufügen. Das Setup dafür ist jedoch in der Datenbank enthalten. Wir können die Produktionsdatenbank in unsere Entwicklungsversion kopieren, um die neuesten Daten zu erhalten, während wir daran arbeiten, die Ansicht zu ändern. Während dieser Zeit kann der Client die Site jedoch immer noch aktualisieren, sodass unsere Dev-Datenbank nicht mehr synchron ist. Wenn wir bereit sind, die neue Ansicht in die Produktion zu verschieben, gibt es einen einfacheren Weg dazu, als die Schritte manuell zu wiederholen, um sie in der Produktionsinstallation einzurichten?

+0

hmm können Sie ein bisschen klären? sprichst du über Setup wie Einstellungen auf bestimmten Modulen im Grunde? – Owen

+0

wirklich gute Frage, danke. – sepehr

Antwort

11

Ich denke, eine gute Strategie hier ist die Verwendung der Installationsprofil-API. Mit der Installationsprofil-API können Sie die meisten Dinge tun, die die Drupal-Admin-Tools verwenden. Die meisten Kernformen setzen einfach Variablen in der Variablentabelle. Um Ihre nicht-contentbezogenen Datenbankinhalte, z. B.Konfiguration ist es ratsam, Update-Funktionen zu verwenden.

Auf meiner Website haben wir auf Modul "ec", die sehr wenig abgesehen davon hat es ec.install Datei enthält Update-Funktionen, z. ec_update_6001()

Ihre Hauptinstallationsfunktion kann dafür sorgen, dass die Aktualisierungen bei jeder neuen Installation ausgeführt werden, die Sie durchführen, um Ihre Module auf den neuesten Stand zu bringen.

function ec_install() { 
    $ret = array(); 
    $num = 0; 
    while (1) { 
    $version = 6000 + $num; 
    $funcname = 'ec_update_' . $version; 
    if (function_exists($funcname)) { 
    $ret[] = $funcname(); 
    $num++; 
    } else { 
    break; 
    } 
    } 
return $ret; 
} 

Eine Probe Update-Funktion oder zwei aus unserer aktuellen Datei folgt nun

// Create editor role and set permissions for comment module 
function ec_update_6000() { 
    install_include(array('user')); 
    $editor_rid = install_add_role('editor'); 
    install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments')); 
    install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval')); 
    install_add_permissions($editor_rid, array('administer comments', 'administer nodes')); 
    return array(); 
} 
// Enable the pirc theme. 
function ec_update_6001() { 
    install_include(array('system')); 
    // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789. 
    install_enable_theme('pirc'); 
    return array(); 
} 

// Add the content types for article and mtblog 
function ec_update_6002() { 
    install_include(array('node')); 
    $props = array(
    'description' => 'Historical Movable Type blog entries', 
); 
    install_create_content_type('mtblog', 'MT Blog entry', $props); 
    $props = array(
    'description' => 'Article', 
); 
install_create_content_type('article', 'Article', $props); 
return array(); 
} 

effektiv meist dies die Versionierung Problem mit Datenbanken und Drupal Code löst. Wir benutzen es ausgiebig. Es ermöglicht uns, neuen Code zu promoten, der die Datenbankkonfiguration ändert, ohne die Datenbank neu importieren oder Änderungen live vornehmen zu müssen. Dies bedeutet auch, dass wir Releases ohne Angst vor versteckten Datenbankänderungen korrekt testen können.

Schließlich unterstützen Cck und Ansichten diesen Ansatz. Sehen Sie diesen Code

// Enable CCK modules, add CCK types for Articles in prep for first stage of migration, 
// enable body for article, enable migration modules. 
function ec_update_6023() { 
    $ret = array(); 
    drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets')); 
    install_include(array('content', 'content_copy')); 
    install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article'); 
    $sql = "UPDATE {node_type} SET body_label='Body', has_body=1 
    WHERE type = 'article'"; 
    $ret[] = update_sql($sql); 
    return $ret; 
} 
11

Ich schrieb einen Artikel auf painless Drupal revision control with CVS and Subversion Best Practices vor einer Weile.

Leider gibt es immer noch das Problem der Quelle die Datenbank zu steuern, wie Sie hingewiesen haben. Es gibt ein paar vorgeschlagene Methoden, die ich in einer additional post erwähne.

+0

Die Links sind tot, und ich kann nicht einmal eine Google-Cache-Version des zweiten finden (re: Quelle, die die Datenbank steuert). Weißt du, wann der Artikel wieder verfügbar ist oder wo ich ihn sonst noch sehen kann? Prost. – jackocnr

+1

Der Artikel scheint auf http://nicksergeant.com/2007/painless-drupal-revision-control-with-cvs-and-subversion-on-a-shared-host/ umgezogen zu sein und der zusätzliche Beitrag ist bei http: //nicksergeant.com/2008/my-thoughts-on-small-scale-drupal-development-to-production-environments-with-cvs-and-subversion/. –

+0

@Caroline, danke für die Aktualisierung der Links – electblake

1

Sie könnten sich die Mühe ersparen, SVN zu konfigurieren und zu arbeiten, wie in Nicks Artikel beschrieben, wenn Sie die svn:externals-Eigenschaft verwenden. Dadurch wird Ihre lokale Version von Drupal automatisch mit der angegebenen Drupal-Verzweigung aktualisiert und Sie können genau denselben Mechanismus für Ihre Module verwenden. Da SVN die externen Definitionen aus einer Datei liest, können Sie diese auch unter Versionskontrolle setzen!

Ich glaube nicht, CVS hat eine gleichwertige Funktion. Es ist jedoch ziemlich einfach, ein einfaches Skript zu schreiben, das automatisch ein Drupal-Modul installiert und nur eine URL annimmt (ich habe dies getan, um meine eigene Drupal-Site auf dem neuesten Stand zu halten).

Was Versionierung der Datenbank betrifft, ist dies ein viel schwieriger zu lösendes Problem. Ich würde vorschlagen, eine Drupal-Datenbank "Lager" in eine SQL-Datei zu exportieren und diese unter Versionskontrolle zu platzieren. Jeder Entwickler hat seinen eigenen lokalen privaten Datenbankserver zu verwenden. Sie könnten dann ein Skript bereitstellen, das eine angegebene Datenbank auf die in der SQL-Datei enthaltene Bestandsversion zurücksetzt.

Als Beispiel, wie dieses Problem auf andere Weise gelöst wird, beschreibe ich die Situation bei der Arbeit. Ich arbeite an einer Webanwendung; Es verwendet keine Datenbank, so dass diese Probleme nicht auftreten. Unsere Methode, die wiederholte Einrichtung von Websites zu umgehen, besteht darin, die Quellcodeverwaltung neu zu erstellen und ein Programm bereitzustellen, um die automatische Bereitstellung der Websites zu erreichen. Das Programm wird auch von unseren Kunden benutzt, um Websites zu erstellen.

1

Einige Module wie CCK und Ansichten ermöglichen den Export und Import ihrer Setup-Daten als Text. Sie können diese textuellen Darstellungen unter dem Quellcodeverwaltungssystem speichern.

7

Unter Drupal-Einstellungen aus der Datenbank in Code-Schnipsel in großen Sprüngen vorwärts bewegt hatte. Zwei Module, die wirklich in diesem Bereich helfen, sind:

Features - Ermöglicht das Zusammenfassen von Entitäten wie Inhaltstypen, Taxonomie, Ansichten, sogar Feeds. Wir verwenden dies sehr erfolgreich und es wurde ermöglicht, diese Änderungen zwischen Entwicklern zu teilen.

Strongarm - Ermöglicht das Speichern und Exportieren der Variablen mit dem obigen Modul. Ich habe einige Tests mit diesem Modul durchgeführt, aber wir verwenden es nicht, einfach, weil wir die Funktionalität wirklich nicht brauchten.

Diese lösen die größten Probleme bei der Aufrechterhaltung der Site-Einrichtung in der Datenbank. Sie sind jedoch nicht perfekt. . . Wir haben Module gefunden, die nicht korrekt unterstützt oder unterstützt wurden.

1

Leider gibt es hier einfach keine gute/einfache Lösung. Das Problem ist ein unglücklicher Nebeneffekt der Architektur von nicht nur Drupal, sondern aller Framework-CMS, bei denen Anwendungen durch Konfiguration (d. H. Daten, die in der Datenbank gespeichert sind) genauso definiert werden wie durch Quellcode. Keine der beiden Möglichkeiten, Konfigurationsdaten zu verwalten, ist groß. Das erste ist, was Sie tun: Definieren Sie eine einzelne Datenbank als kanonisch (dh die Produktionsdatenbank) und lassen Sie die Entwickler lokal mit einer Momentaufnahme der Produktionsdatenbank arbeiten und neue Konfigurationsinformationen in die Produktionsdatenbank durch manuelle Konfiguration über die Produktionsstätte "zusammenführen" Admin-Schnittstelle. Im Fall gut definierter Subsysteme - z. B. Views - können Sie möglicherweise die Vorteile von Import-/Exportfunktionen nutzen, die speziell für diese Art der Konfigurationsmigration entwickelt wurden. Die zweite Option - also die Automatisierung, nach der Sie suchen - ist schwierig, könnte sich aber für große Projekte mit dem Budget für komplexe Projektautomatisierung lohnen - oder erforderlich: tief in die System-/Modul-DB-Struktur eintauchen und Custom-Scripting entwickeln füge neue Konfigurationsdaten auf Tabellen-/Datensatzebene in die Produktionsdatenbank ein, zum Beispiel als Teil eines nächtlichen Builds der neuesten Datenbank. Angst, es gibt einfach keine Zwischenlösung.

In Bezug auf die Versionskontrolle für die historische Verfolgung der Konfigurationsdaten ermöglicht ein Modul wie backup_migrate das Ausführen automatisierter SQL-Dumps der Datenbank. Sie können auswählen, welche Tabellen gedumpt werden, indem Sie ein Sicherungs- "Profil" definieren und große, protokollierende und zwischengespeicherte Tabellen (z. B. node, cache_content, watchdog) aus dem Speicherauszug zurücklassen, so dass Sie einen leichter zu verwaltenden Chunk für die Versionierung haben . Einige einfache Scripts auf dem Server oder anderswo könnten den neuesten Dump erfassen und ihn zu Ihrem Repository hinzufügen.

0

Drupal unterstützt jetzt exportables Konfiguration, mit denen Sie den Großteil einer Website-Konfiguration in Code verschieben können. Exportablets werden mit Hilfe des Moduls features für Konfigurationsvariablen, Ansichten, Inhaltstyp, Felder, Eingabeformate usw. unterstützt.

Sie können auch die anfängliche, nicht exportierbare Konfiguration und Konfigurationsänderungen über ein zentrales Controller Profil oder Modul verwalten. Verwenden Sie es, um Module zu aktivieren, Benutzer zu erstellen usw.

Siehe The Development -> Staging -> Production Workflow Problem in Drupal und die Code driven development: using Features effectively in Drupal 6 and 7 Präsentation.

Verwandte Themen