Willkommen im Land der F eatures C onfiguration M anagement, auch bekannt als FCM ! Es geht nicht nur um Features und nicht um Configuration Management (wie in Drupal Version 8 eingeführt). Stattdessen ist es ein besonderer Fall von S oftware C onfiguration M anagement , auch bekannt als SCM . Meistens, weil Features als Codegenerator betrachtet werden können, während der generierte Code durch mehrere Umgebungen migriert werden muss. Lesen Sie weiter für weitere Details.
1 - Vor- und Nachteile der Verwendung von Funktionen
Vorteile der Verwendung von Funktionen
- Automatisieren Sie die Bereitstellung von Änderungen, die auf eine Drupal-Entwicklungssite angewendet wurden, auf einer oder mehreren Ziel-Drupal-Produktionsstandorten (anstelle der manuellen Bereitstellung).
- Erleichtert das Teilen (Versenden) der laufenden Drupal-Entwicklung zwischen Drupal-Entwicklern / Site-Erstellern (z. B. um einem Drupal-Themer, der auf einer anderen Entwicklungs-Site arbeitet, einige von einem Ansichten-Experten erstellte Ansichten zur Verfügung zu stellen, um diese Ansicht zu thematisieren).
- Hervorragende Integration von GIT und Drush für den Versand einer Kopie des von Features (auf der Entwicklungssite) generierten Codes an ausgewählte Ziel- (Vor-) Produktionsstandorte.
Nachteile der Verwendung von Funktionen
- Das Vermeiden von Feature- Konflikten und / oder das Verwalten von Feature- Abhängigkeiten kann eine Herausforderung sein!
- Es ist nicht einfach, Features auf einer vorhandenen (Produktions-) Site zu verwenden.
- Das Installieren / Aktivieren des Features- Moduls ist einfach (nur ein Modul), es ist jedoch eine große Herausforderung, den richtigen Umgang mit Features zu erlernen .
2 - Techniken zum Verpacken von Merkmalen
Mit Features können Sie den Inhalt eines Features nach Ihren eigenen Vorstellungen zusammenstellen. Hier sind einige Techniken, die dafür verwendet werden können.
Ein einziges Super-Feature
Dies ist eine ziemlich einfache Verpackungstechnik: Alles ist in einem einzigen Feature zusammengefasst (manche nennen es das "Gott" -Feature ...). Scheint einfach, ziemlich vorwärts usw. Aber diese Technik führt auch mehr oder weniger sofort zu "Konflikten" (wie unten erklärt) ...
Ein guter Verwendungszweck hierfür scheint die Erstellung einer "Drupal - Distribution" zu sein, bei der angenommen wird, dass alle Benutzer dieselbe Gruppe von Modulen, Konfigurationen usw. verwenden "features" ...) erscheint es sinnvoller, solche Features in mehrere Features aufzuteilen, wie weiter unten erläutert.
Basierend auf der Funktionalität der Website
Diese Verpackungstechnik erstellt für jede Funktionalität einer Website ein separates Feature, z. B .:
- Feature A = Implementiere eine " * Galerie ".
- Feature B = Implementierung eines " * Blogs ".
- Feature C = Implementiere einen " * Event Calendar ".
Basierend auf den Drupal Admin-Abschnitten
Diese Verpackungstechnik erstellt separate Funktionen für jeden der (Haupt-) Administrationsbereiche einer Drupal-Website, die zum Erstellen der Website verwendet werden, z. B .:
- Alle erforderlichen Module sind in Merkmal A enthalten.
- Alle Basisfelddefinitionen sind in Merkmal B enthalten.
- Alle Inhaltstypen sind in Feature C enthalten.
- Alle Berechtigungen sind in Feature D enthalten,
- Alle Rollen sind in Merkmal E enthalten,
- Alle Variablen sind in Merkmal F enthalten,
- Alle (benutzerdefinierten) Ansichten sind in Feature G enthalten.
- Alle (benutzerdefinierten) Regeln sind in Feature H enthalten.
- Etc.
Die Liste oben ist praktisch unbegrenzt: Am Ende können Sie sich sogar eine Funktion für jede Drupal-Admin-Menüoption vorstellen ... wenn Sie so weit gehen möchten.
IMO ist auch der empfohlene Ansatz für Paketfunktionen.
3 - Reduzieren der Wahrscheinlichkeit von Konflikten in Features und / oder GIT
Felder nicht wiederverwenden
Nicht wenige Konflikte scheinen durch die Wiederverwendung von Feldern zwischen mehreren Inhaltstypen verursacht zu werden. ZB in Inhaltstyp A haben Sie ein Feld mit Maschinennamen field_somefield
, das auch als Feld in Inhaltstyp B mit demselben Maschinennamen verwendet wird, field_somefield
aber als ein anderer Feldtyp und / oder eine andere (n) andere (n) Feldeinstellung (en).
Indem Sie Felder unter Inhaltstypen nicht wiederverwenden, vermeiden Sie, in diesem Problem ausgeführt zu werden. Sehen Sie sich eine interessante Namenskonvention für den Computernamen Ihrer Inhaltstypen und -felder an, wie in der Tabelle der Wrapping-Informationsarchitektur und -dokumentation gezeigt , die Teil der Artikel über " Relativitätsmodell für Drupal " ist. Weitere Informationen hierzu finden Sie in meiner Antwort auf " Wie modelliere ich Inhalte (Typen) aus datenbankzentrierter Sicht? ".
Geteilte Funktionen, je nachdem, wer was bearbeitet
Wenn mehrere Personen an einem Standort arbeiten, kann die Anzahl der Konflikte verringert werden, indem Funktionen basierend darauf organisiert (= erstellt) werden, wer an was arbeitet. Ein Beispiel hierfür könnte wie folgt aussehen:
- Views geht in Feature A,
- Regeln gehen in Merkmal B,
- Charts geht in Feature C,
- Alles über Theming geht in Feature D,
4 - Empfohlene Drupal-Umgebungen
Alles, was oben steht, sollte irgendwie helfen, die Nutzung von Features zu erleichtern . Um jedoch sicherzustellen, dass die Dinge wie erwartet (geplant) funktionieren, benötigen Sie aus den folgenden Gründen auch eine Reihe geeigneter Umgebungen (logisch verwandte Drupal-Websites):
- Zusammenführungsfunktionen, die durch mehrere Funktionen bereitgestellt werden.
- Konflikte vorhersagen und lösen.
- Endbenutzertest aller zusammengeführten Funktionen, die als konfliktfrei zertifiziert sind.
Im Idealfall sollten diese logisch zusammenhängenden Drupal-Websites wie folgt konfiguriert und verwendet werden:
- Persönliche Entwickler- Site - Jeder Website-Entwickler hat eine separate Entwickler-Site. Wenn ein Teil der Entwicklung für die Weitergabe an einen anderen Benutzer bereit ist, wird ein entsprechendes Feature erstellt, das an die Staging-Umgebung gesendet wird.
- Sandbox-Site - Dies ist eine Drupal-Umgebung, die nur den Drupal-Kern enthält und zum Komponententest der Vollständigkeit einer einzelnen Funktion verwendet wird. Sollte eine Funktion versehentlich unerwartete Abhängigkeiten aufweisen (z. B. ein Modul, von dem die Funktion abhängt und das in der Sandbox nicht aktiviert ist), wird diese Abhängigkeit hier deutlich.
- Staging-Site - Hier werden ein oder mehrere Features (die auf einer Entwickler-Site erstellt wurden) bereitgestellt. Dies kann nur ein Hotfix für ein Produktionsproblem sein, oder die gesamte Entwicklung für eine neue Version der Website wird konsolidiert. Wenn Konflikte zwischen mehreren Funktionen bestehen, werden diese zuerst in dieser Umgebung angezeigt ... und müssen auf irgendeine Weise behoben werden.
- QA-Site - Nachdem die Staging-Umgebung als stabil eingestuft wurde, ist es an der Zeit, mit den relevanten Funktionen fortzufahren und sie auch auf einer höheren Ebene zur Verfügung zu stellen, wo sie für QA-Tests, Abnahmetests, Volumentests usw. verwendet werden können Seien Sie äußerst vorsichtig, wenn Sie zusätzliche Änderungen zulassen (falls vorhanden). Da eine solche Änderung alle vorherigen Testbemühungen in dieser Umgebung ungültig machen kann.
- Shadow Production Site - Um die Aktivierung in der realen Produktion vorzubereiten, möchten Sie möglicherweise zunächst die relevanten Funktionen in einer Umgebung weiterentwickeln, die als Kopie (Schatten) Ihrer realen Produktionsumgebung betrachtet wird. Wenn zu diesem Zeitpunkt während des Migrationsprozesses noch etwas kaputt geht, ist dies eine rote Fahne, um einige Ihrer vorherigen Schritte zurückzusetzen. Beheben Sie den Fehler und versuchen Sie es erneut, bis alle beteiligten Parteien die Änderungen genehmigt haben.
- Produktionsstandort (e) - Wenn Sie alle vorherigen Schritte ausgeführt haben, sollte dieser Schritt selbsterklärend und recht einfach sein. Je nach Ihren Anforderungen kann es sich um eine einzelne Site handeln oder um eine Site, die den Drupal-Sites für mehrere Sites entspricht, wobei auf allen beteiligten Sites dieselben Versionen aller Funktionen ausgeführt werden.
- Baseline-Site - Nach meiner Erfahrung gibt es (wenn überhaupt) nicht viele Drupal-Implementierungen, bei denen (auch) diese Art von Site verwendet wird. Es handelt sich lediglich um eine Kopie der Produktionswebsite (n), die den Drupal-Entwicklern, -Testern usw. zur Verfügung steht. Sie kann verwendet werden, um das Erscheinungsbild der Produktionswebsite zu überprüfen, Benutzerschulungen durchzuführen usw. und jederzeit eine neue Entwicklung durchzuführen Wenn der Zyklus gestartet wird, sollten die Komponenten einer Site, die betroffen sein werden (geändert werden müssen), "irgendwie kopiert" werden, wobei diese Basis-Site als Eingabe und als Ziel eine Website für die persönliche Entwicklung verwendet wird .
Offensichtlich ist das obige Inventar der Arten von Drupal-Sites wie die ideale Welt. Abhängig von der Größe Ihres Entwicklungsteams und / oder den verfügbaren Budgets, um diese zu erstellen und zu verwalten, werden möglicherweise nicht alle davon verwendet (oder sind erschwinglich). Dieses Inventar orientiert sich an den Best Practices im Bereich SCM, die in den meisten großen / globalen Unternehmen (Banken, Fluggesellschaften usw.) zum Einsatz kommen.
5 - Verwandte Module
Starker Arm
Das Strongarm- Modul ermöglicht den Export von Variablen (von Modulen, deren Einstellungen in Variablen gespeichert sind) mit dem Features-Modul.
Knotenexport
Mit dem Knotenexportmodul können Benutzer Knoten exportieren und dann in eine andere Drupal-Installation importieren.
Rollenexport
Die Rollen Export - Modul ermöglicht machine_names Rollen zu haben , und erzeugt eine einzigartige Rolle - ID (RID) der machine_name basiert. Rollen können mit Features exportiert werden und werden genau so gelöscht, wenn sie auf anderen Websites importiert werden.
Eigenschaften Banish
Mit dem Modul " Features Banish" können Sie einzelne Feature-Komponenten vollständig aus der Feature-Benutzeroberfläche und dem Feature-Export ausschließen. Hier ist ein Zitat darüber von seiner Projektseite:
Dieses Modul ist nützlich, wenn es Feature-Komponenten gibt, die Sie NIEMALS exportieren möchten. Wenn Sie Funktionen zum Erstellen oder Bereitstellen von Websites verwenden, ist Ihnen wahrscheinlich das Problem begegnet, dass versehentlich Zeitstempelvariablen wie cron_last oder update_last_check exportiert wurden. Möglicherweise möchten Sie auch Berechtigungen für Entwicklermodule sperren, damit diese nicht mit den übrigen zu exportierenden Websiteberechtigungen in Berührung kommen. Verbannte Gegenstände werden in Ihrem Funktionsmodul ODER in ANDEREN FUNKTIONSMODULEN nicht angezeigt. Seien Sie daher vorsichtig. Eine zentrale Liste der Funktionen, die niemals exportiert werden sollten, finden Sie unter https://www.drupal.org/node/2400531
BOHNE
Das Bean- Modul macht Ihre Blöcke exportierbar. Hier ist ein Zitat darüber von seiner Projektseite:
Stellen Sie sich eine Bean als Methode vor, um neue Typen bereitzustellen (im Vergleich zu Node wäre dies ein Inhaltstyp), die dann eine Schnittstelle zum Hinzufügen von Inhalten bereitstellt, mit der Sie so viele Blöcke erstellen können, wie Sie benötigen (siehe Abbildung unten). Der Bean-Inhalt kann dann wie jeder andere Block auf der Site platziert werden.
Dieses Modul funktioniert auch hervorragend in Kombination mit den Modulen UUID und UUID Features Integration . Dieses Modul wurde erst ab D7 gestartet, ist aber bereits in Drupal 8 enthalten. Das Video-Tutorial Drupal Bean-Modul-Tutorial - Verwenden der Bean Admin-Benutzeroberfläche bietet eine großartige Einführung, um die Leistung dieses Moduls und die Art der Dinge, die Sie damit tun können, wirklich zu verstehen (indem Sie nur Techniken zur Site-Erstellung verwenden, kein benutzerdefiniertes Codieren erforderlich).
Lebensraum
Der Habitat - Modul ist am sinnvollsten in einem Funktion -basierten Workflow. Hier ist ein Zitat darüber von seiner Projektseite:
In einer Umgebung mit mehreren Umgebungen (z. B. prod, test, dev, local) gibt es einige Module, die in bestimmten Umgebungen immer aktiviert oder deaktiviert werden sollen. Jedes Mal, wenn Sie eine Datenbank synchronisieren, müssen Sie dieselben Module erneut aktivieren / deaktivieren. Schlimmer noch, Sie werden faul und lassen die Entwicklungsmodule in der Produktion aktiviert.
Habitat bietet Einstellungen zum Aktivieren oder Deaktivieren bestimmter Module für jede Umgebung (Habitat). Setzen Sie einfach eine Variable mit zB $ conf ['habitat'] = 'local'; in Ihrer settings.php-Datei (die tatsächlich zu verwendende Variable ist für Ihren aktuellen Workflow konfigurierbar). Das Deaktivieren / Aktivieren der Module erfolgt über hook_init.
6 - Empfohlene Ressourcen:
7 - Mögliche Alternativen zur Verwendung von Funktionen
Wenn Sie (noch) nicht in der Lage oder gewillt sind, Features zu verwenden , sollten Sie prüfen, inwieweit die folgenden Ansätze / Module eine Alternative darstellen.
Manueller Export / Import
Dies sind die allgemein bekannten Einrichtungen (um zu vermeiden das Wort Funktionen ...) zur Verfügung über die Admin - UI, für Module wie Regeln , Ansichten , etc. (unvollständige Liste!).
Bundle kopieren
Einige Leute halten das Bundle- Kopiermodul für eine mögliche Alternative. Es hat Export / Import-Unterstützung für:
- Knotentypen.
- Taxonomie.
- Benutzer.
- Feld-API-Felder.
- Feldgruppen.
Zusammenführungskonflikte sind wahrscheinlich eine Selbstverständlichkeit, wenn mehrere Entwickler ihre Konfiguration in ein Feature integrieren. Ich habe mehrere Richtlinien für die Überprüfung von Feature-Code geschrieben, aber ich denke, das Wichtigste ist Folgendes:
Übernehmen Sie nur beabsichtigte Codeänderungen.
Was bedeutet das? Dies bedeutet, dass jeder Entwickler den Code vor dem Festschreiben überprüfen muss . Es gibt keine "Magie", um unbeabsichtigte Codeänderungen zu verhindern, ohne dass ein Entwickler vorsichtig ist.
git diff
.git diff > blah.patch
, und ändern Sie den Patch manuell, sodass nur die beabsichtigten Konfigurationsänderungen berücksichtigt werden.10dd
Benutzer entfernt die Änderungen in einem Patch (zum Beispiel).featurename.features.field_base.inc
."git commit -a
. Dies ist eine schreckliche Praxis, die von der Verwendung gestrichen werden sollte. Immer hinzufügen und explizit festschreiben!git rebase
auf lokalen git Filialen um sicherzustellen , dass die Funktion ist up-to-date.git merge -s recursive -X patience
(benötigt git 1.7+ iirc).Erwägen Sie schließlich, Entwicklern soziale Einschränkungen hinzuzufügen, damit ein Entwickler seinen Code überprüfen muss, bevor er mit Patch-Überprüfung oder Pull-Anforderung in trunk / stable zusammengeführt wird. Die Leute werden sich über soziale Einschränkungen ärgern, aber sie sollten sich selbst ärgern, wenn sie ihren Code nicht überprüfen.
quelle
git add -p
das Festschreiben bestimmter Chunks verwendet.