drush aggiornatob per un singolo modulo


28

È possibile eseguire la funzione di aggiornamento di un singolo modulo tramite Drush? Vedo drush updatedbche non accetta un modulename come argomento ed esegue tutti gli aggiornamenti disponibili. Quindi c'è drush pm-updateanche il controllo di nuovi file. la documentazione dice:

(uguale a pm-updatecode + updatedb)

Questo significa che se drush pm-updateeseguo tutti gli aggiornamenti disponibili (nuove uscite update_function) verranno eseguiti? C'è un modo per aggiornare (db) esattamente un solo modulo?


So che questa domanda è piuttosto vecchia, ma sono curioso: perché dovresti volerlo? Normalmente, tutto il codice si basa sul presupposto che il db sia aggiornato. Se non vuoi eseguire l'aggiornamento db di un modulo specifico, non dovresti ripristinare l'intero modulo a una versione precedente?
marcvangend,

1
un anno dopo. Ne avevo bisogno per quanto segue: ho creato un modulo personalizzato, ma in seguito ho modificato il layout della tabella (ancora in fase di sviluppo), quindi sarebbe utile aggiornare il db con il nuovo schema.
Maarten Hartman,

Risposte:


10

No, non puoi.

Se vuoi aggiornare ogni modulo da solo, aggiorna solo i file di un singolo modulo e quindi esegui updateb.


Vedi il commento qui sotto sull'uso drush dl(probabilmente vorrai eliminare prima il vecchio modulo in modo da non tenere in giro i file più vecchi non destinati alla nuova versione!)
doublejosh

C'è un modo per farlo al di fuori della droga?
lathomas64,

2
@ahimsauzi ha dato la risposta corretta
cybercampbell,

21

Su Drush 5.7 è possibile eseguire il comando drush pm-update --no-core module-name. Drush eseguirà automaticamente il backup del modulo corrente, scaricherà la nuova versione e richiederà di aggiornare il database.


6
Ciò eseguirà TUTTI gli aggiornamenti in sospeso, non solo quelli del modulo che hai aggiornato.
moshe weitzman,

Moshe, puoi chiarire? Ho eseguito il comando sopra e sebbene Drush controllerà TUTTI gli aggiornamenti in sospeso, verrà aggiornato solo il modulo specificato (nome modulo sopra). Mi sto perdendo qualcosa?
ahimsauzi,

6
Controlla tutti gli aggiornamenti del codice in sospeso e aggiorna solo il codice per il modulo specificato, ma elaborerà tutti gli aggiornamenti del database .
Meustrus,

8

Se si desidera eseguire un solo aggiornamento, è possibile eseguire drush eval foo_update_33(), ad esempio. In pratica, è un po 'più complesso di quello in quanto devi caricare il file .install ma non molto.

Puoi anche provare la soluzione @macaleaa:

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


3
Aggiungerò che sarebbe bello se qualcuno realizzasse un'estensione Contrib per Drush che ti consentisse di eseguire aggiornamenti selezionati. Non è una cosa sicura da fare in generale, ma a volte devi vivere pericolosamente. Tuttavia, non è appropriato per il core Drush (io sono il manutentore del Drush)
moshe weitzman,

2
Perché non appropriato per il drush core? Non è possibile che qualcuno voglia imporre un particolare ordine di aggiornamenti del database (per il codice già scaricato), nel qual caso ogni singolo modulo dovrebbe essere aggiornato separatamente? Sono anch'io in una situazione del genere.
Meustrus

da dove viene il 33? è il nome della macchina del modulo?
lathomas64,

Il 33 fa parte del nome della funzione di aggiornamento e determina l'ordine. E sì, foo è il nome della macchina del modulo. Puoi trovare le funzioni in foo.install. Ad esempio, il modulo devel (in devel.install) ha diverse funzioni di aggiornamento: function devel_update_7000è quello con il numero più basso e verrà eseguito per primo, quindi function devel_update_7001, ecc.
Ursula

3
Ecco un esempio che carica prima il file di installazione:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa

5

drush up someproject, né drush upc someprojectsembrano aggiornare solo il someprojectmodulo. Un modo diverso da quello che vuoi è attraverso:

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

Ecco la discussione di un argomento simile su Drupal.org. Stai attento !


Ho appena provato, e drush up someprojectFUNZIONA, MA sfortunatamente controlla TUTTI gli aggiornamenti disponibili per i moduli abilitati anche di default (che non sarebbe necessario), scrive "Aggiornamento disponibile" su alcuni di essi, ma aggiorna SOLO il progetto specifico. Ecco uno screenshot: i.imgur.com/TDDmB.png . Come puoi vedere, sono disponibili più aggiornamenti, ma solo xmlsitemap viene aggiornato utilizzando drush up xmlsitemap.
Sk8erPeter

4

Sto usando Drush 5.9 e posso aggiornare con successo un singolo modulo con questo comando:

drush dl *project*

Quindi, ad esempio, per aggiornare il modulo 'devel':

drush up devel

1

Credo che ora sia possibile con Drush, usando up:

drush up module_name

0

Ho avuto una situazione in cui una tabella creata da una funzione di aggiornamento ( MYMODULE_update_7101), ma a quella tabella si accedeva nel codice da qualche parte in ogni cache libera e in quasi ogni chiamata drush (stava praticamente ottenendo i nomi dei tipi di entità per tutti i menu e qualunque cosa altro). La corsa drush updatedbera MYMODULE_update_7101terza invece che prima.

Ho provato la soluzione suggerita da @macaleaa e @moshe weitzman di correre:

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

prima di essere eseguito drush updatedb, ma questo non ha aiutato: l'esecuzione del drush ha avuto esito negativo perché ha updatedbtentato di eseguire nuovamente MYMODULE_update_7101()ed è stata eliminata, dicendo che la tabella esisteva già. Fondamentalmente, il codice sopra aveva eseguito l'aggiornamento, ma non ha lasciato il segno sul sistema che l'aggiornamento era stato eseguito. Presumibilmente c'è un sacco di altre cose update.phpda fare dopo aver eseguito ogni aggiornamento per memorizzare l'ultimo numero di versione per il modulo nel database, ecc.

Ho update.phpesaminato come esegue effettivamente ogni funzione di aggiornamento e cosa fa dopo, cercando una funzione da chiamare che chiamasse la funzione di aggiornamento e facesse anche tutte le altre cose. Ho finito per arrivare a questo:

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

Che ho effettivamente eseguito con Drush:

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

Ha eseguito l'aggiornamento, nessun problema, ma poi MYMODULE versione 7101 è ancora apparso nell'elenco degli aggiornamenti quando ho eseguito updatedb, ANCHE se funzionava senza errori e tutto sembrava buono all'ispezione del sito.

Un po 'confuso e in ritardo di 6 anni, ma va tutto bene che finisce bene?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.