drush updatedb para un solo módulo

28

¿Es posible realizar la función de actualización de un solo módulo a través de drush? Puedo ver drush updatedbcuál no toma un nombre de módulo como argumento y ejecuta todas las actualizaciones disponibles. Luego está el drush pm-updateque también busca nuevos archivos. la documentación dice:

(igual que pm-updatecode + updatedb)

¿Significa esto que si ejecuto drush pm-updatetodas las actualizaciones disponibles (nuevas actualizaciones de function_function) se realizarán? ¿Hay alguna manera de actualizar (db) solo un módulo exactamente?

nonsenz
fuente
Sé que esta pregunta es bastante antigua, pero tengo curiosidad: ¿por qué querrías eso? Normalmente, todo el código se basa en el supuesto de que la base de datos está actualizada. Si no desea que se ejecute la actualización db de un módulo específico, ¿no debería revertir todo el módulo a una versión anterior?
marcvangend
1
un año después. Necesitaba esto para lo siguiente: hice un módulo personalizado, pero cambié el diseño de la tabla más adelante (aún en la etapa de desarrollo), por lo que sería útil actualizar el db con el nuevo esquema.
Maarten Hartman

Respuestas:

10

No puedes.

Si desea actualizar cada módulo por su cuenta, solo actualice los archivos de un solo módulo y luego ejecute updatedb.

Berdir
fuente
Vea el comentario a continuación sobre el uso drush dl(¡probablemente desee eliminar el módulo anterior primero para no quedarse con los archivos más antiguos que no están destinados a la nueva versión!)
doublejosh
¿Hay alguna manera de hacer esto fuera de drush?
lathomas64
2
@ahimsauzi dio la respuesta correcta
cybercampbell
21

En Drush 5.7 puedes ejecutar el comando drush pm-update --no-core module-name. Drush respaldará automáticamente el módulo actual, descargará la nueva versión y le pedirá que actualice la base de datos.

ahimsauzi
fuente
66
Eso ejecutará TODAS las actualizaciones pendientes, no solo las del módulo que actualizó.
moshe weitzman el
Moshe, puede aclarar? He estado ejecutando el comando anterior y, aunque Drush verificará TODAS las actualizaciones pendientes, solo se actualizará el módulo especificado (nombre del módulo anterior). ¿Me estoy perdiendo de algo?
ahimsauzi
66
Comprueba todas las actualizaciones de código pendientes y solo actualiza el código para el módulo especificado, pero procesará todas las actualizaciones de la base de datos .
meustrus
8

Si desea ejecutar solo una actualización, puede ejecutar drush eval foo_update_33(), por ejemplo. En la práctica, es un poco más complejo que eso, ya que tiene que cargar el archivo .install pero no mucho.

También puedes probar la solución @macaleaa:

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

Moshe Weitzman
fuente
3
Agregaré que sería genial si alguien hiciera una extensión de Contrib para Drush que le permita ejecutar actualizaciones seleccionadas. Eso no es algo seguro en general, pero a veces hay que vivir peligrosamente. Ello no fuera adecuado para el núcleo Drush aunque (yo soy el mantenedor Drush)
Moshe Weitzman
2
¿Por qué no es apropiado para el núcleo drush? ¿No es posible que alguien quiera imponer un orden particular de actualizaciones de la base de datos (para el código ya descargado), en cuyo caso cada módulo individual necesitaría actualizarse por separado? Estoy en tal situación yo mismo.
meustrus
¿De dónde viene el 33? ¿Es foo el nombre de la máquina del módulo?
lathomas64
El 33 es parte del nombre de la función de actualización y determina el orden. Y sí, foo es el nombre de la máquina del módulo. Puede encontrar las funciones en foo.install. Por ejemplo, el módulo devel (en devel.install) tiene varias funciones de actualización: function devel_update_7000es el que tiene el número más bajo, y se ejecutan en primer lugar, a continuación function devel_update_7001, etc
Ursula
3
Aquí hay un ejemplo que carga el archivo de instalación en primer lugar:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa
5

ni drush up someproject, tampoco drush upc someprojectparecen parecen actualizar sólo el someprojectmódulo. Una forma diferente de hacerlo es a través de:

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

Aquí hay una discusión sobre un tema similar en Drupal.org. Cuídate !

yo mismo
fuente
Acabo de intentarlo, y drush up someprojectFUNCIONA, PERO desafortunadamente verifica TODAS las actualizaciones disponibles para los módulos habilitados de forma predeterminada también (lo que no sería necesario), escribe "Actualización disponible" para algunos de ellos, pero SOLO actualiza el proyecto específico. Aquí hay una captura de pantalla: i.imgur.com/TDDmB.png . Como puede ver, hay varias actualizaciones disponibles, pero solo xmlsitemap se actualiza con drush up xmlsitemap.
Sk8erPeter
4

Estoy usando Drush 5.9, y puedo actualizar un solo módulo con éxito con este comando:

drush dl *project*

Entonces, por ejemplo, para actualizar el módulo 'devel':

drush up devel
Barra
fuente
1

Creo que esto es posible ahora con Drush, usando up:

drush up module_name
zgreen
fuente
0

Tuve una situación en la que una tabla creada por una función de actualización ( MYMODULE_update_7101), pero a esa tabla se estaba accediendo en código en algún lugar de cada caché limpia y casi cada llamada borrosa (básicamente obtenía los nombres de tipos de entidad para todos los menús y lo que sea más). Correr drush updatedbera correr MYMODULE_update_7101tercero en lugar de primero.

Probé la solución sugerida por @macaleaa y @moshe weitzman de correr:

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

antes de correr drush updatedb, pero esto no ayudó: la carrera drush falló porque updatedbtrató nuevamente de correr MYMODULE_update_7101()y erró, diciendo que la mesa ya existía. Básicamente, el código anterior había ejecutado la actualización, pero no dejó su marca en el sistema de que la actualización se había ejecutado. Presumiblemente, hay un montón de otras cosas update.phpque hacer después de ejecutar cada actualización para almacenar el último número de versión para el módulo en la base de datos, etc.

Revisé update.phppara ver cómo se ejecuta cada función de actualización y qué hace después, buscando una función para llamar que llame a la función de actualización y también haga todas las demás cosas. Terminé llegando a esto:

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

Lo que realmente corrí con drush:

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

Ejecutó la actualización, no hay problema, pero MYMODULE versión 7101 todavía apareció en la lista de actualizaciones cuando ejecuté updatedb, aunque se ejecutó sin errores y todo se veía bien en la inspección del sitio.

Un poco hacky y con 6 años de retraso, pero todo está bien y eso termina bien

nerdlinger
fuente