Wie verwende ich das Features-Modul in einer 3-Entwickler-Umgebung?

19

Bei der Arbeit an einem Projekt, bei dem häufig Features verwendet werden , gibt es manchmal 3 Entwickler für diese Anwendung.

Wir haben ein paar Ansätze ausprobiert, aber wenn wir unsere Git-Zweige zusammenführen, scheint es, als würden wir häufig die Funktionsänderungen des anderen überschreiben. Konflikte gibt es zuhauf und das Feature-Modul ist kaputt, was die Verwendung anscheinend schmerzhaft macht.

Features sind wirklich eine enorme Zeitersparnis bei der Konfiguration von Projekten, und ich bin mir ziemlich sicher, dass es eine Möglichkeit gibt, dies zu beheben.

Gibt es einen Workflow oder eine Prozedur, die das Risiko von Konflikten und Überschreibungen verringert?

Hinweise auf Funktionen sind willkommen.

stefgosselin
quelle

Antworten:

20

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_somefieldaber 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
Pierre.Vriens
quelle
1
Beste Antwort, die ich je gesehen habe.
Kein Sssweat
@NoSssweat Merci für das Lob ... aber wisst, dass ich es immer noch als ziemlich unvollständig betrachte. ZB enthält es kaum etwas über den "Lebenszyklus" von Verarbeitungsfunktionen und sagt noch nicht viel über Dinge wie Auswirkungsanalyse, Prüfung, Versionsverwaltung, Autorisierungen und und (ein weiteres Dutzend von Themen oder so).
Pierre.Vriens
1
@ Pierre.Vriens - Danke! Ich glaube, ich bin auf die harte Tour zu dem gleichen Schluss gekommen wie Ihre ausgezeichnete Antwort. Ich hatte versucht, nach Komponenten zu teilen (views_views, dependency, etc.), hatte aber Konflikte, als ich versuchte, das Feature zu generieren. Ich erkannte -> danach ->, dass ich wahrscheinlich die Funktion konfigurieren musste, um Abhängigkeiten nicht zu überprüfen und Konflikte zu ignorieren.
stefgosselin
7

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.

  • Codeänderungen überprüfen mit git diff.
  • Erstellen Sie mit einen schnellen Diff-Patch git diff > blah.patch, und ändern Sie den Patch manuell, sodass nur die beabsichtigten Konfigurationsänderungen berücksichtigt werden.
    • Dinge wie "mtime", Kommentare in Ansichtsexporten in der Info-Datei müssen nicht in das Commit einbezogen werden.
    • Ich bin ziemlich geschickt darin geworden, Konfigurationscode-Unterschiede im Laufe der Zeit zu überprüfen. Es ist jetzt einfacher, überflüssige Änderungen in Ansichten oder Bedienfeldern zu erkennen, und ein schneller 10ddBenutzer entfernt die Änderungen in einem Patch (zum Beispiel).
    • Ich denke "Oh, hey, ich habe nichts geändert, was mit Feldern zu tun hat, also werde ich mich nicht festlegen featurename.features.field_base.inc."
  • Niemals benutzen git commit -a. Dies ist eine schreckliche Praxis, die von der Verwendung gestrichen werden sollte. Immer hinzufügen und explizit festschreiben!
  • Verwenden Sie git rebaseauf lokalen git Filialen um sicherzustellen , dass die Funktion ist up-to-date.
  • Eine Git-Merge-Strategie kann auch hilfreich sein, wenn Sie eine Zusammenführung durchführen:
    • 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.

mradcliffe
quelle
Besser als das Generieren einer Patch-Datei wird nur git add -pdas Festschreiben bestimmter Chunks verwendet.
donquixote