Was ist der richtige Kern-Update-Workflow für Komponisten?

14

Ich möchte Composer zum Verwalten von Drupal 8-Abhängigkeiten verwenden, bin mir jedoch nicht sicher, welcher Kernaktualisierungsworkflow der richtige ist. Im Moment verwende ich drush, um den Kern auf die neueste Beta-Version zu aktualisieren, aber ich habe auch einige Abhängigkeiten in meiner composer.json-Datei. Nach dem Update verwende ich die Composer-Installation, um alle Abhängigkeiten der Contrib-Anbieter zu installieren. Es scheint, dass das Ausführen composer installeinige Dateien im Kernverzeichnis überschreibt, obwohl ich gerade den Kern auf die neueste Version aktualisiert habe.

Ich habe auch versucht, die Datei composer.json manuell zu bearbeiten und die Zeile "drupal / core" durch die spezifische Beta-Version zu ersetzen "drupal/core": "~8.0-beta14",, aber sie überschreibt weiterhin Dateien im Core-Verzeichnis.

Was ist der richtige Workflow?

reiss
quelle

Antworten:

11

Ich gehe davon aus, dass Sie Drupal-Composer / Drupal-Project als Basis für Ihr Projekt verwenden. Wenn nicht, schauen Sie sich das Projekt an und vergleichen Sie es mit Ihrem.

Außerdem haben Sie gesagt, dass Sie Composer zum Verwalten von Drupal 8-Abhängigkeiten verwenden möchten. Ich gehe also davon aus, dass Sie Ihre Contrib-Module über ausgewählt haben composer require drupal/develund nicht über drush dl devel.

Wenn Sie all diese Dinge tun, sollten Sie verwenden composer update, um den Drupal-Kern und alle Ihre Contrib-Module zu aktualisieren. Solange Sie Ihre composer.lockDatei behalten , composer installsollten Sie die Version Ihrer Abhängigkeiten nicht ändern. Sie sollten überhaupt nicht verwenden drush pm-update. Es sollte Ihnen egal sein, ob Dateien im coreVerzeichnis aktualisiert werden oder nicht, da dieses Verzeichnis von Composer verwaltet wird. Sie sollten keine von Composer verwalteten Verzeichnisse in Ihrem Repository festschreiben, obwohl Sie dies auf Wunsch tun können.

Natürlich sollten Sie drush updatedbimmer dann laufen, wenn Sie den composer updateDrupal-Kern oder ein beliebiges Modul ersetzen.

Um zu vermeiden, dass Entwicklungsversionen abgerufen werden, setzen Sie Ihre Mindeststabilität in der Datei composer.json mithilfe von Composer-Stabilitätsflags auf "beta" .

Wenn Sie Ihre Site mit drupal-composer / drupal-project verwalten, werden alle Stammdateien wie README.txt, .htaccess und index.html Eigentum Ihres Projekts. Das bedeutet, dass Sie sie in Ihr Git-Repository einchecken sollten. Composer aktualisiert sie nicht. Sie müssen sie selbst aktualisieren, wenn sie sich ändern. Diese Dateien sollten sich nur selten ändern, aber Drupal-Composer / Drupal-Project verfügt über ein Skript zum Aktualisieren dieser Dateien .

greg_1_anderson
quelle
Nehmen wir an, ich verwende das Composer-Update anstelle von drush pm-update. Wie aktualisiere ich Dateien wie README.txt, .htaccess usw.? Und warum gibt Drush Update einen anderen Kern als Composer Update? Und sollte ich die drupal-Version in meiner composer.json vor jedem Update auf 8.0-betaX ersetzen? Ich möchte dev nicht benutzen. version ..
rreiss
Die Antwort wurde aktualisiert.
greg_1_anderson
+1 greg_1_anderson - das sieht gut aus. Ist dies die endgültige Möglichkeit, Sicherheitsupdates für Drupal 8 durchzuführen? mit D7 ist es: drupal.stackexchange.com/a/71578
therobyouknow
Das sieht so aus, als würde es funktionieren, wenn man Drupal 8.1 mit den folgenden Schritten installiert hätte: drupal.org/node/2471553 (ich fand, dass dies ohne Fehler funktioniert)
wissen,
"Natürlich sollten Sie drush updatedbimmer dann ausführen, wenn das Composer-Update den Drupal-Kern oder ein beliebiges Modul ersetzt." - Vielen Dank. Wenn Sie Drupal ursprünglich mit diesen Schritten installiert haben, benötigen Sie den vollständigen Pfad zu dem jeweiligen Problem mit Ihrer Drupal 8-Installation (da diese die Installation als letzten Schritt ausgeführt hat). Sie müssen zuerst in das Web cd und einmal in / web den Befehl zum Aktualisieren der Datenbank mit dem vollständigen Pfad wäre daher: ../vendor/drush/drush/drush updatedb(Ich fand dies funktioniert).
Therobyouknow
2

Im Folgenden ist OK für Patch - Versionen 8.4.x> 8.4.y , aber nicht OK für kleinere Releases 8.4.x> 8.5.x . Wechseln Sie zu UPDATE 3 , um die Antwort auf kleinere Release-Updates zu finden.

1- Sichern Sie alle Dateien, die mit Drupal geliefert werden und die Sie geändert haben, z. B. .htaccess, robots.txt usw. (die beiden am häufigsten geänderten).

2- [Mir wurde mitgeteilt, dass das Löschen der Sperrdatei falsch ist, siehe UPDATE unten] Löschen Sie die Datei composer.lock (im obersten Ordner Ihrer Site). Dies wird in Schritt 5 neu erstellt.

3- Überprüfen Sie Ihre composer.json (im obersten Ordner Ihrer Site) und stellen Sie sicher, dass sich "drupal: core" im Bereich require und nicht in einem Ersetzungsbereich befindet

"require": {
"drupal/core": "^8.4"
},

nicht

"replace": {
"drupal/core": "^8.4"
},

Wenn sich "Drupal / Core" im Ersetzungsabschnitt befindet, verschieben Sie es in den erforderlichen Abschnitt und löschen Sie den Ersetzungsabschnitt. Wenn es andere Einträge im Ersetzungsabschnitt gibt, entfernen Sie einfach den "Drupal / Core", nicht den gesamten Ersetzungsabschnitt - aber ich denke, "Drupal / Core" ist normalerweise das einzige, was dort vorhanden ist.

Tragen Sie in "drupal / core" die Version ein, auf die Sie updaten möchten, Beispiele:

"drupal / core": "^ 8.5" - wird auf die neueste Version von 8.5 aktualisiert. "drupal / core": "8.4.6" - wird auf Version 8.4.6 aktualisiert.

5- Führen Sie dies aus (im obersten Ordner Ihrer Site):

composer update drupal/core --with-dependencies

6- Wenn keine Fehler aufgetreten sind, führen Sie die Updates wie gewohnt aus und leeren Sie den Cache:

drush updatedb
drush cr

Wenn Sie drush nicht verwenden, gehen Sie zu /update.php, um Updates auszuführen, dann zu admin / config / development / performance und klicken Sie auf die Schaltfläche "Alle Caches löschen".

7- Wenn Sie im ersten Schritt Dateien gesichert hatten (.htaccess, robots.txt), setzen Sie sie zurück. Überprüfen Sie jedoch, ob Drupal Aktualisierungen an diesen Dateien vorgenommen hat, und fügen Sie diese Änderungen zu Ihren hinzu.

ERLEDIGT

Wenn beim Composer-Update in Schritt 5 Fehler aufgetreten sind, liegt dies normalerweise an Problemen mit den Versionen des Materials im Herstellerordner.

Dies ist ein großartiger Beitrag im Umgang mit solchen Problemen: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update und lies Jeffs andere 2 Beiträge auf Drupal und Composer, um sie zu erhalten mehr Wissen darüber.

Auf Twitter wurde mir von 2 Leuten gesagt, dass composer.lock nicht gelöscht werden soll (Schritt 2 oben). Der composer update drupal/core --with-dependenciesBefehl erstellt die Sperrdatei trotzdem neu.

Wenn ich diese Methode teste, finde ich, dass sie für 8.4.3> 8.4.6 (zum Beispiel) gut funktioniert, aber ich bekomme Fehler für 8.4.6> 8.5.x. Werde zurück berichten, wenn ich es herausgefunden habe.

Beispiel für Fehler:

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - drupal/core 8.5.0 requires symfony/yaml ~3.4.5 -> satisfiable by symfony/yaml[3.4.x-dev].
    - Installation request for drupal/core 8.5.0 -> satisfiable by drupal/core[8.5.0].
    - Installation request for symfony/console (locked at v3.2.8, required as ~3.2.8) -> satisfiable by symfony/console[v3.2.8].

Dieser Beitrag von Jeff Geerling befasst sich mit ähnlichen Problemen, aber bisher kein Glück für mich: https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update

Also ... das einzige, was für mich bei 8.4.x> 8.5.x zu funktionieren scheint, ist die "nukleare Option", die so viele andere zu nutzen scheinen und die ausgeführt wird composer update.

Ich denke, das ist in Ordnung, solange Sie sich über die Modulversionen in composer.json sicher sind. Vielleicht sollte man sie auf die aktuelle Version beschränken. Beispielsweise:

"drupal/address": "1.3"

eher, als:

"drupal/address": "^1.3"

Aber ist das die richtige Antwort?

OK, die Antwort, die überall zu sein scheint, ist die "nukleare Option":

A. Löschen Sie den /vendorOrdner.

B. Führen composer updateSie die Module zusammen mit dem Core aus und aktualisieren Sie sie einfach. Oder sperren Sie die Modulversionen, composer.jsonwenn Sie sie nicht aktualisieren möchten.

Eine Person auf Drupal Slack sagte: "Die ganze Philosophie von Composer ist, dass Sie Pakete immer so häufig wie möglich aktualisieren sollten . " Paket beinhaltet Module, denke ich. Es macht also einen Sinn, denke ich.

Sobald ich von 8.4.6 auf 8.5.0 kam, funktionierte dies einwandfrei, um von 8.5.0 auf 8.5.1 zu kommen, composer update drupal/core --with-dependenciesgenauso wie es bei 8.4.3 auf 8.4.6 der Fall war.

Ich fange an zu folgern, dass "die Antwort" darin besteht, dass das Löschen des Vendor-Ordners und der composer.lock-Datei und die anschließende Verwendung composer updatein Ordnung sind und dass man einfach sicherstellen sollte, dass die Versionsnummern für Abhängigkeiten in der composer.json-Datei Ihren Wünschen entsprechen . Es ist keine große Sache, zu verwalten, welche Modulversionen Sie behalten oder ein Update zulassen möchten composer.json.

Beispielsweise:

"drupal/admin_toolbar": "1.18", bedeutet bei 1.18 bleiben

"drupal/admin_toolbar": "^1.18", Also mach weiter und aktualisiere aber innerhalb von 1.x (nicht 2.x)

Dies wird durch einen Kommentar (General Redneck) zu diesem Beitrag untermauert : https://www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update "Eines der Dinge, die ich habe Während ich im Support arbeite, ist es eine gute Idee, die Versionen der Module und des Kerns zu sperren, damit Sie das Ding thermonuken können, wenn Sie wollen, weil es Zeiten gibt, in denen sich einige der verschiedenen Plugins nicht richtig verhalten wollen. "

Übrigens ist die Datei composer.lock keine Hilfe, composer updateda sie weggeblasen wird (im Gegensatz zu composer installdem Ort, an dem die Sperrdatei gelesen wird):

Laufen composer installwird:

  • Überprüfen Sie, ob ein composer.lockvorhanden ist
  • Wenn nicht, führen Sie eine aus, um eine composer updatezu erstellen
  • Falls composer.lockvorhanden, installieren Sie die angegebenen Versionen aus der Sperrdatei

Laufen composer updatewird:

  • Prüfen composer.json
  • Bestimmen Sie die neuesten zu installierenden Versionen anhand Ihrer Versionsspezifikationen
  • Installieren Sie die neuesten Versionen
  • Aktualisieren Sie composer.lock, um die neuesten installierten Versionen zu berücksichtigen

Ref: https://www.engineyard.com/blog/composer-its-all-about-the-lock-file

Ich sehe, dass dies oben erwähnt wird: https://github.com/drupal-composer/drupal-project . Ich habe das verwendet und es ist in Ordnung, aber es ist keine Voraussetzung für die Verwendung von Composer mit Drupal. Es ist verwirrend, da es sich so "anhört", als wäre es vom Namen. Als ich mit Drupal 8 anfing, dachte ich, es sei erforderlich, und baute meine erste D8-Site damit auf.

In dieser "Version" von Drupal befindet sich docroot in einem / web-Ordner, nicht im obersten Ordner des Projekts. Außerdem wurde .gitignore im Vergleich zu normalem Drupal einiges hinzugefügt:

/drush/contrib/
/vendor/
/web/core/
/web/modules/contrib/
/web/themes/contrib/
/web/profiles/contrib/
/web/libraries/

Daher ist diese Version von Drupal eher für Sites gedacht, die eine kontinuierliche Integration verwenden, um bei jeder Bereitstellung mithilfe der Composer-Installation eine neue Drupal-Version zu erstellen. Wenn Sie mit einer normaleren Methode bereitstellen, müssen Sie natürlich alle oben genannten Dinge für Ihr Git-Repo festschreiben, oder es wird nicht auf Ihrem Server bereitgestellt [1], und diese Dinge werden alle benötigt, damit Drupal ausgeführt werden kann.

[1] Wenn Git an Ihrer Bereitstellung beteiligt ist - Wenn Sie mit SFTP bereitstellen, ignorieren Sie dies.

Richard Hood
quelle
composer update drupal/core symfony/config webflo/drupal-core-strict --with-dependencieshat mich noch nie im Stich gelassen. Funktioniert über mehrere Nebenversionen, zB 8.3 -> 8.6
Clive
1

Mit dem Drupal / Core- Paket auf packagist.org können wir den Core, die Contrib-Module (, Themen und Profile) und die anderen Anbieter über Composer verwalten.

Ich habe die folgenden Dateien in meinem Stammverzeichnis eingerichtet und ausgeführt composer install

composer.json

{
  "require": {
    "composer/installers": "^1.0.20",
    "drupal/core": "8.0.*"
  },
  "extra": {
    "installer-paths": {
      "core": ["type:drupal-core"],
      "modules/contrib": ["type:drupal-module"],
      "profiles/contrib": ["type:drupal-profile"],
      "themes/contrib": ["type:drupal-theme"]
    }
  },
  "scripts": {
    "post-install-cmd": [
      "./post_install.sh"
    ]
  }
}

post_install.sh

#!/usr/bin/env bash
export RAW_DRUPAL="https://raw.githubusercontent.com/drupal/drupal/8.0.x"
curl $RAW_DRUPAL/example.gitignore > example.gitignore
curl $RAW_DRUPAL/.gitattributes > .gitattributes
curl $RAW_DRUPAL/.htaccess > .htaccess
curl $RAW_DRUPAL/.csslintrc > .csslintrc
curl $RAW_DRUPAL/.editorconfig > .editorconfig
curl $RAW_DRUPAL/.eslintrc > .eslintrc
curl $RAW_DRUPAL/.eslintignore > .eslintignore
curl $RAW_DRUPAL/index.php > index.php
curl $RAW_DRUPAL/update.php > update.php
curl $RAW_DRUPAL/web.config > web.config
curl $RAW_DRUPAL/autoload.php > autoload.php
curl $RAW_DRUPAL/robots.txt > robots.txt
mkdir -p sites/default
curl $RAW_DRUPAL/sites/example.sites.php > sites/example.sites.php
curl $RAW_DRUPAL/sites/development.services.yml > sites/development.services.yml
curl $RAW_DRUPAL/sites/example.settings.local.php > sites/example.settings.local.php
curl $RAW_DRUPAL/sites/default/default.services.yml > sites/default/default.services.yml
curl $RAW_DRUPAL/sites/default/default.settings.php > sites/default/default.settings.php

Genießen :)

Eyal
quelle
Ich denke, ich werde all die Lockenmagie brauchen, die du getan hast. Ich hatte erwartet, dass alle diese benötigten Dateien vom Komponisten erstellt werden.
Dxvargas
@hiphip Die Dateien außerhalb des Hauptverzeichnisses ändern sich nicht oft. Daher kann es sich bei den oben genannten Dateien um ein Skript handeln, das Sie manuell ausführen, wenn Drupal-Updates von einer Nebenversion zur nächsten (dh von 8.1 auf 8.2) durchgeführt werden.
Eyal
1

Ja, Sie können Drupal Core mit Composer verwalten. Es gibt jedoch ein paar Dinge zu beachten.

Wahrscheinlich treten Zeitüberschreitungen auf, die auf eine Reihe von Elementen zurückzuführen sind, die Composer ausführen muss, insbesondere, wenn Sie in einer lokalen VM ausgeführt werden. Wenn Sie ausführen composer install, wird wahrscheinlich der Composer-Fehler angezeigt:

 [RuntimeException]                                    
  Could not delete core/.nfs0000000000000000000001:

Stellen Sie sicher, dass Sie erforderlich verwenden

{
  "require": {
   "drupal/core": "8.3.*"

Fügen Sie dem Timeout in der Konfiguration auch eine Erweiterung hinzu

    "installer-paths": {
        "core": ["type:drupal-core"],
        "modules/contrib/{$name}": ["type:drupal-module"],
        "profiles/contrib/{$name}": ["type:drupal-profile"],
        "themes/contrib/{$name}": ["type:drupal-theme"],
        "drush/contrib/{$name}": ["type:drupal-drush"],
        "modules/custom/{$name}": ["type:drupal-custom-module"],
        "themes/custom/{$name}": ["type:drupal-custom-theme"]
    }
},

"config":{
            "process-timeout": 1600
       },

Wenn dies nicht funktioniert, können Sie die Composer-Installation auch von außerhalb von SSH in Ihrer VM ausführen .

Dies umgeht alle NFS-Freigabe-Timeouts und entpackt Drupal an der richtigen Stelle.

BigEd
quelle
0

"drupal / core": "~ 8.0-beta14" bedeutet, dass alle Releases größer als 8.0-beta14 und kleiner als 9 sind! Sie möchten die Tilde entfernen, um sie für eine bestimmte Version zu sperren. Stellen Sie dann sicher, dass Sie Ihre Sperrdatei aktualisieren, indem Sie Composer ausführen, und verwenden Sie auf dem Zielsystem die Composer-Installation.

Ein einfacher Einstieg besteht darin, die Codebasis mit https://github.com/drupal-composer/drupal-project zu erstellen .

Wenn wir etwas wie das Aktualisieren des Kerns aktualisieren müssen, führen Sie "composer up" lokal aus. Dadurch wird die Datei composer.lock aktualisiert.

Wenn andere Entwickler herunterfahren oder ein Bereitstellungsskript ausführen, führen Sie "composer install" aus, das die Sperrdatei verwendet.

Die Zeile in unserem composer.json für Drupal-Core lautet:

"drupal/core": "~8.0",

Die Tilde () bedeutet jedes Release innerhalb der 8-Zahl (aber nicht 9) .

Wenn Sie es für eine bestimmte Version sperren möchten, sollten Sie die Tilde nicht verwenden.

"drupal/core": "8.0-beta14",

Führen Sie dann "composer up" lokal aus, übertragen Sie die Dateien "composer.json" und "composer.lock" und führen Sie "composer install" in anderen Installationen aus, nachdem Sie die Codebasis heruntergezogen haben.

oknate
quelle