web-dev-qa-db-fra.com

drush updatedb pour un seul module

Est-il possible d'effectuer la fonction de mise à jour d'un seul module via drush? Je vois drush updatedb qui ne prend pas de nom de module comme argument et exécute toutes les mises à jour disponibles. Ensuite il y a drush pm-update qui vérifie également les nouveaux fichiers. le documentation dit:

(identique à pm-updatecode + updatedb)

Est-ce à dire si je lance drush pm-update toutes les mises à jour disponibles (sorties de mise à jour plus récentes) seront-elles effectuées? Existe-t-il un moyen de (db) mettre à jour exactement un module?

28
nonsenz

Non, tu ne peux pas.

Si vous souhaitez mettre à jour chaque module individuellement, mettez à jour uniquement les fichiers d'un seul module, puis exécutez updatedb.

10
Berdir

Sur Drush 5.7, vous pouvez exécuter la commande drush pm-update --no-core module-name. Drush sauvegarde automatiquement le module actuel, télécharge la nouvelle version et vous invite à mettre à jour la base de données.

22
ahimsauzi

Si vous souhaitez exécuter une seule mise à jour, vous pouvez exécuter drush eval foo_update_33(), par exemple. En pratique, c'est un peu plus complexe que cela car il faut charger le fichier .install mais pas beaucoup.

Vous pouvez également essayer la solution @macaleaa:

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

8
moshe weitzman

ni drush up someproject, ni drush upc someproject semble ne mettre à jour que le module someproject. Une manière différente de ce que vous voulez est:

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

Voici une discussion sur un sujet similaire sur Drupal.org. Attention!

5
myselfhimself

J'utilise Drush 5.9, et je peux mettre à jour un seul module avec succès avec cette commande:

drush dl *project*

Ainsi, par exemple, pour mettre à jour le module 'devel':

drush up devel
4
Rod

Je pense que c'est désormais possible avec Drush, en utilisant up:

drush up module_name
1
zgreen

J'ai eu une situation dans laquelle une table créée par une fonction de mise à jour (MYMODULE_update_7101), Mais cette table était accessible en code quelque part dans chaque cache vide et presque chaque appel drush (il obtenait essentiellement les noms des types d'entités pour tous les menus et autres). L'exécution de drush updatedb Exécutait MYMODULE_update_7101 Troisième au lieu de premier.

J'ai essayé la solution suggérée par @macaleaa et @moshe weitzman de courir:

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

avant d'exécuter drush updatedb, mais cela n'a pas aidé - l'exécution drush a échoué car updatedb a de nouveau tenté d'exécuter MYMODULE_update_7101() et s'est trompé, disant que la table existait déjà. Fondamentalement, le code ci-dessus avait exécuté la mise à jour, mais n'avait pas laissé sa marque sur le système que la mise à jour avait été exécutée. Vraisemblablement, il y a un tas d'autres choses que update.php Doit faire après avoir exécuté chaque mise à jour pour stocker le dernier numéro de version du module dans la base de données, etc.

J'ai parcouru update.php Pour voir comment il exécute réellement chaque fonction de mise à jour et ce qu'il fait après, à la recherche d'une fonction à appeler qui appellerait la fonction de mise à jour et ferait toutes les autres choses. J'ai fini par y arriver:

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

Ce que j'ai couru avec drush:

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

Il a exécuté la mise à jour, pas de problème, mais la version 7101 de MYMODULE est toujours apparue dans la liste des mises à jour lorsque j'ai exécuté updatedb, bien qu'il ait fonctionné sans erreur et que tout semblait bien lors de l'inspection du site.

Un peu hacky et 6 ans de retard, mais tout va bien qui se termine bien?

0
nerdlinger