Los ganchos "post_update" que se han ejecutado se almacenan en la base de datos, en la key_value
tabla, post_update
colección, pero los datos se serializan y son difíciles de actualizar directamente.
Utilicé algunos de los detalles de la respuesta de @ kiamlaluno para crear un script drush que puedes usar para restablecer un solo gancho. Aquí hay una versión básica (la versión más larga está aquí ):
#!/usr/bin/env drush
$key_value = \Drupal::keyValue('post_update');
$update_list = $key_value->get('existing_updates');
$choice = drush_choice($update_list, dt('Which post_update hook do you want to reset?'));
if ($choice) {
$removed_el = $update_list[$choice];
unset($update_list[$choice]);
$key_value->set('existing_updates', $update_list);
drush_print("$removed_el was reset");
} else {
drush_print("Reset was cancelled");
}
Y aquí hay un ejemplo de cómo se ve cuando lo ejecuta desde la línea de comandos:
./scripts/reset_hook_post_update_NAME.drush
Which post_update hook do you want to reset?
[0] : Cancel
[1] : system_post_update_add_region_to_entity_displays
[2] : system_post_update_hashes_clear_cache
[3] : system_post_update_recalculate_configuration_entity_dependencies
[4] : system_post_update_timestamp_plugins
[5] : my_module_post_update_example_hook
# The script pauses for user input.
5
my_module_post_update_example_hook was reset
Aquí hay un ejemplo que puede usar desde la línea de comandos con drush php-eval:
Cuando vuelva a ejecutar drush updatedb, verá su post_update_hook esperando a ser ejecutado.
fuente
drush php:eval 'command'
UpdateRegistry::getPendingUpdateFunctions()
contiene el siguiente código. Mira lo que dice el comentario.UpdateRegistry :: $ updateType está establecido en
'post_update'
.$this->keyValue
se ajusta desdeUpdateRegistryFactory::create()
el valor de$this->container->get('keyvalue')->get('post_update')
.El código de procedimiento equivalente para obtener esa colección keyvalue es el siguiente.
Establezca existente_updates en una matriz vacía, y Drupal pensará que no se ha llamado a ninguna de las devoluciones de llamada posteriores a la actualización.
Elimine el nombre de devolución de llamada de la clave existente_actualizaciones de ese valor clave, y Drupal pensará que aún no se ha invocado la devolución de llamada posterior a la actualización.
fuente
Llámalo desde adentro
hook_update_n()
y luego haz lo que estabas haciendo antes.fuente