drush updatedb für ein einzelnes Modul

28

Ist es möglich, die Update-Funktion eines einzelnen Moduls über drush auszuführen? Ich kann sehen, drush updatedbwelche keinen Modulnamen als Argument nimmt und alle verfügbaren Updates ausführt. Dann wird drush pm-updateauch nach neuen Dateien gesucht. In der Dokumentation heißt es:

(wie pm-updatecode + updatedb)

Bedeutet dies, dass drush pm-updatejedes verfügbare Update (neuere Update_Function-Exits) ausgeführt wird? Gibt es eine Möglichkeit, nur genau ein Modul (db) zu aktualisieren?

Nichtvorhandensein
quelle
Ich weiß, dass diese Frage ziemlich alt ist, aber ich bin neugierig: Warum willst du das? Normalerweise basiert jeder Code auf der Annahme, dass die Datenbank aktuell ist. Wenn Sie nicht möchten, dass die Datenbankaktualisierung eines bestimmten Moduls ausgeführt wird, sollten Sie nicht das gesamte Modul auf eine frühere Version zurücksetzen?
Marcvangend
1
ein Jahr später. Ich brauchte dies für Folgendes: Ich habe ein benutzerdefiniertes Modul erstellt, aber das Tabellenlayout später geändert (noch in der Entwicklungsphase), sodass es praktisch wäre, die Datenbank nur mit dem neuen Schema zu aktualisieren.
Maarten Hartman

Antworten:

10

Nein, kannst du nicht.

Wenn Sie jedes Modul einzeln aktualisieren möchten, aktualisieren Sie nur die Dateien eines einzelnen Moduls und führen Sie anschließend updatedb aus.

Berdir
quelle
Lesen Sie den folgenden Kommentar zur Verwendung drush dl(Sie möchten wahrscheinlich zuerst das alte Modul löschen, damit Sie keine älteren Dateien behalten, die nicht für die neue Version vorgesehen sind!)
doublejosh
Gibt es eine Möglichkeit, dies außerhalb von Drush zu tun?
Lathomas64
2
@ahimsauzi gab die richtige Antwort
Cybercampbell
21

Unter Drush 5.7 können Sie den Befehl ausführen drush pm-update --no-core module-name. Drush sichert automatisch das aktuelle Modul, lädt die neue Version herunter und fordert Sie auf, die Datenbank zu aktualisieren.

ahimsauzi
quelle
6
Damit werden ALLE ausstehenden Updates ausgeführt, nicht nur diejenigen aus dem von Ihnen aktualisierten Modul.
Moshe Weitzman
Moshe, kann das klären? Ich habe den obigen Befehl ausgeführt und obwohl Drush ALLE ausstehenden Aktualisierungen überprüft, wird nur das angegebene Modul (Modulname oben) aktualisiert. Vermisse ich etwas?
Ahimsauzi
6
Es überprüft alle ausstehenden Code-Aktualisierungen und aktualisiert nur den Code für das angegebene Modul, verarbeitet jedoch alle Datenbank- Aktualisierungen.
meustrus
8

Wenn Sie nur ein Update ausführen möchten, können Sie es beispielsweise ausführen drush eval foo_update_33(). In der Praxis ist es etwas komplexer, da Sie die .install-Datei laden müssen, aber nicht viel.

Sie können auch die @macaleaa-Lösung ausprobieren:

drush php-eval 'module_load_install('my_module');my_module_update_7XXX();'

Moshe Weitzman
quelle
3
Ich werde hinzufügen, dass es großartig wäre, wenn jemand eine Contrib-Erweiterung für Drush erstellen würde, mit der Sie ausgewählte Updates ausführen können. Das ist im Allgemeinen keine sichere Sache, aber manchmal muss man gefährlich leben. Nicht für Core-Drush geeignet (ich bin der Drush-Betreuer)
Moshe Weitzman
2
Warum nicht für Core Drush geeignet? Ist es nicht möglich, dass jemand eine bestimmte Reihenfolge von Datenbankaktualisierungen erzwingen möchte (für bereits heruntergeladenen Code). In diesem Fall müsste jedes einzelne Modul separat aktualisiert werden? Ich bin selbst in einer solchen Situation.
meustrus
Woher kommt die 33 von hier? ist foo der Rechnername des Moduls?
Lathomas64
Die 33 ist Teil des Namens der Update-Funktion und bestimmt die Reihenfolge. Und ja, foo ist der Maschinenname des Moduls. Sie finden die Funktionen in foo.install. Zum Beispiel hat das Entwicklungsmodul (in devel.install) mehrere Aktualisierungsfunktionen: function devel_update_7000ist die mit der niedrigsten Nummer und wird zuerst ausgeführt, dann function devel_update_7001usw.
Ursula
3
Hier ist ein Beispiel, das zuerst die Installationsdatei lädt:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa
5

Weder scheinen drush up someprojectnoch drush upc someprojectnur das someprojectModul zu aktualisieren . Ein anderer Weg zu dem, was Sie wollen, ist durch:

drush dl someproject #use --select option to be prompted for a module version
                     #this will overwrite your exising module's files
                     #backup your modules files with --backup, yourself, use a VCS to revert
drush updb           #run available database update scripts

Hier wird ein ähnliches Thema auf Drupal.org diskutiert. Pass auf !

selbst
quelle
Ich habe gerade versucht, und drush up someprojectfunktioniert, ABER leider überprüft es ALLE verfügbaren Updates für aktivierte Module auch standardmäßig (was nicht benötigt würde), schreibt "Update verfügbar" für einige von ihnen, aktualisiert aber NUR das spezifische Projekt. Hier ist ein Screenshot: i.imgur.com/TDDmB.png . Wie Sie sehen, sind mehrere Aktualisierungen verfügbar, aber nur mit xmlsitemap werden Aktualisierungen durchgeführt drush up xmlsitemap.
Sk8erPeter
4

Ich verwende Drush 5.9 und kann mit diesem Befehl ein einzelnes Modul erfolgreich aktualisieren:

drush dl *project*

So aktualisieren Sie beispielsweise das Modul 'devel':

drush up devel
Stange
quelle
1

Ich glaube, dass dies jetzt mit Drush möglich ist, mit up:

drush up module_name
zgreen
quelle
0

Ich hatte eine Situation, in der eine Tabelle durch eine Update-Funktion ( MYMODULE_update_7101) erstellt wurde, aber auf diese Tabelle wurde in Code irgendwo in jedem Cache-Speicher und bei fast jedem Drush-Aufruf zugegriffen (im Grunde wurden die Namen der Entitätstypen für alle Menüs und was auch immer abgerufen) sonst). Laufen drush updatedbwar MYMODULE_update_7101dritter statt erster.

Ich habe die von @macaleaa und @moshe weitzman vorgeschlagene Lösung ausprobiert:

drush php-eval 'module_load_install('MYMODULE');MYMODULE_update_7101();'

vor dem Laufen drush updatedb, aber das hat nicht geholfen - der Drush-Lauf ist fehlgeschlagen, weil updatedberneut versucht wurde zu laufen MYMODULE_update_7101()und ein Fehler aufgetreten ist, der besagt, dass die Tabelle bereits existiert hat. Grundsätzlich hat der oben genannte Code das Update ausgeführt, aber auf dem System keine Spuren hinterlassen, dass das Update ausgeführt wurde. Vermutlich update.phpmuss nach jedem Update eine ganze Reihe anderer Dinge erledigt werden, um die neueste Versionsnummer für das Modul in der Datenbank usw. zu speichern.

Ich ging durch, um update.phpzu sehen, wie es tatsächlich jede Update-Funktion ausführt und was es danach tut, und suchte nach einer aufrufbaren Funktion, die die Update-Funktion aufruft und auch alle anderen Dinge erledigt. Am Ende kam ich dazu:

include_once DRUPAL_ROOT . "/includes/update.inc";
$c["results"]["#abort"] = array();
update_do_one("MYMODULE", 7101, array(), $c);

Womit ich eigentlich drush gelaufen bin:

drush eval 'include_once DRUPAL_ROOT . "/includes/update.inc"; $c["results"]["#abort"] = array(); update_do_one("MYMODULE", 7101, array(), $c);'

Das Update lief, kein Problem, aber dann tauchte MYMODULE Version 7101 immer noch in der Update-Liste auf, als ich lief updatedb, obwohl es ohne Fehler lief und bei der Inspektion der Site alles gut aussah.

Ein bisschen hacky und 6 Jahre zu spät, aber alles gut, das gut endet?

Nerdlinger
quelle