Cómo mover los módulos instalados de / sites / all / modules / * a / sites / all / contrib / modules / *

34

He estado buscando las respuestas a esta pregunta sin suerte en absoluto. Por lo que observo en la estructura de la base de datos, la ubicación de los módulos se especifica en la tabla 'sistema'. La única solución que tengo es escribir una consulta SQL para actualizar la columna 'nombre de archivo'.

¿Existe una solución mejor / más limpia para resolver esto, por ejemplo, un módulo contrib?

Logi
fuente

Respuestas:

27

Solo necesita mover sus módulos a su nueva ubicación y reconstruir el registro. Cuando el registro se reconstruya, la ruta a los módulos se actualizará. Compruebe registry_rebuild().

Vuelve a analizar todo el código en módulos o incluye directorios, almacenando la ubicación de cada interfaz o clase en la base de datos.

Sin embargo, le recomendaría que haga una copia de seguridad de su base de datos antes de probar esto.

Si está utilizando drush, también podría reconstruir el registro con el siguiente comando:

drush cc registry

También puede instalar el registry_rebuildcomando para drush:

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr
Código ciclónico
fuente
Si lo entiendo correctamente, también podría truncar su registry_filetabla, lo que obligará a drupal a volver a escanear todos los archivos y reconstruir la tabla.
Cyclonecode
3
Truncar la tabla parece una mala idea y lo más probable es que resulte en un sitio totalmente roto.
Berdir
@ Berdir: acepta que suena como una mala idea. Pero, solo lo intenté y parece funcionar. Primero tomé una copia de seguridad y trunqué toda la tabla usando DELETE FROM registry_file;y agregué una llamada a rebuild_registry()mi page.tpl.php.
Cyclonecode
Esto es demasiado complicado, solo haz lo que dijo John Laine , siempre me ha funcionado.
Jim Kirkpatrick
1
@ JimKirkpatrick: tienes razón, no es necesario deshabilitar los módulos.
Cyclonecode
10

Restablecí una copia de seguridad de la producción local e intenté simplemente mover cosas y presionar admin / modules o ejecutar register_rebuild () pero no impidió que se produjeran errores fatales. Esto tiene sentido para mí, ya que algunos módulos pueden usar incluir o lo que sea en su hook_init (), o puede tener una ruta de enrutador de menú establecida que depende de un módulo o incluir que Drupal no puede encontrar en bootstrap. En última instancia, esto es lo que hice (tus caminos pueden ser diferentes):

Paso 1: Reemplazar sitios / todos / módulos con sitios / todos / módulos / contrib

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');

Paso 2: Reemplace sites / all / modules / contrib con sites / all / modules / custom por módulos de espacios de nombres personalizados

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';

Paso 3: Mueva los módulos de desarrollo a sitios / todos / módulos / dev

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';

Paso 4: borra los cachés para que las cosas arranquen correctamente

TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path

Nota: Si usa un módulo personalizado o una contribución como LoginToboggan para manejar 403 (acceso denegado) y ha cerrado la sesión durante este proceso, es posible que deba actualizar la include_filecolumna en la menu_rotertabla para usar la nueva ruta para el archivo de inclusión . Esto es probablemente una ocurrencia rara.

UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'

Una vez que se hayan ejecutado estas consultas, lo que solo tomará una fracción de segundo, presione admin / config / development / performance y borre la memoria caché para que se reconstruyan las rutas del menú.

Charlie Schliesser
fuente
¡Gracias por esto! Intenté los pasos mencionados en las respuestas principales, pero eso no ayudó en mi caso. Sospecho que cualquier persona en un sitio alojado en Pantheon necesita realizar estas declaraciones de db en su respuesta y luego hacer el "drush Registry-rebuild" y "drush cc Registry"
Anne Bonham
Ah, y en Pantheon, no pude obtener el sitio con el módulo Redis en ningún otro sitio que no sea sitios / todos / módulos, así que simplemente me di por vencido y dejé este módulo en la carpeta de módulos raíz. Ah, bueno, al menos mis otros módulos están muy bien organizados.
Anne Bonham
Para aquellos que usan LoginToboggan, aquí están los 3 comandos MySQL que necesitará:update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
tyler.frankenstein
9

Pruebe la herramienta genial de Mark Sonnabaum: Drush Rebuild Project Paths . Automatiza el proceso; funcionó muy bien para mí Utiliza Drush , por supuesto.

Sin embargo, haré una segunda sugerencia para que pruebes esto en una copia de la base de datos de tu sitio.

greg_1_anderson
fuente
7

Para el registro, hay un gran comando drush para reconstruir el registro: http://drupal.org/project/registry_rebuild

Hay mucha información en la página del proyecto.

jonhattan
fuente
Este es mi método preferido para mover módulos. Tenía algunos módulos que estaban habilitados en los sites/all/modulesque había que contribmoverlos al subdirectorio. Todo lo que tenía que hacer eradrush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek
Esto funcionó para mí. Primero moví todos mis módulos y luego hice el registro_rebuild
gerl
Curiosamente, drush rr --fire-bazookaconduce a errores, pero drush rrestá bien.
Alex Skrypnyk
5

En primer lugar, siempre haga una copia de seguridad de su base de datos, por lo que es muy fácil hacerlo si algo sale mal y no hizo una copia de seguridad.

No estoy seguro si importa si deshabilita los módulos o no; es posible que desee hacerlo, por si acaso. Entonces haz esto:

  1. Ponga su sitio en modo de mantenimiento en (nombre del sitio) / admin / config / development / maintenance
  2. Mueva físicamente sus módulos en el sistema de archivos.
  3. Borre sus cachés en (sitename) / admin / config / development / performance, o simplemente vuelva a guardar la página de módulos.

¡Todo listo! Drupal volverá a buscar todos los módulos instalados.

John Laine
fuente
+1 para el modo de mantenimiento, siempre es bueno hacer esto antes de algo como esto
Cyclonecode
1
Esto causa errores fatales el 100% del tiempo para mí. Quizás funcione si mueve módulos que no tienen dependencias o algo así.
ergophobe
4

¿Por qué no prueba el módulo Reconstruir registro ? Funcionó todo el tiempo para mí.

Aquí hay una cita al respecto (de la página del proyecto del módulo):

Hay momentos en Drupal 7 cuando el registro se mancha irremediablemente y necesita reconstruir el registro (una lista de clases PHP y los archivos con los que van). A veces, sin embargo, no puede hacer esta actividad regular de limpieza de caché porque se requiere alguna clase cuando el sistema está intentando arrancar.

drupalastic
fuente
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. Si hay un procedimiento para mover módulos que incluye el uso del módulo que vinculó, descríbalo.
Mołot
Ninguna teoría ... funciona. Siga las instrucciones en la página. Utilicé el método drush y simplemente funcionó.
iLLin
3

Puede usar el módulo de Reconstrucción de registro , que se integra con Drush a través del Drush RRcomando.

Básicamente lo que haces son estos pasos:

  1. Mueva sus módulos a otro directorio y
  2. Registry Rebuild reconstruirá la tabla del sistema para colocar los módulos en el lugar correcto.

Lo aprendí / descubrí por primera vez a través de DrupalEasy Podcast # 133 , que explica además cómo se puede usar este módulo / drush cmd.

PD: Por supuesto, primero realice una copia de seguridad de su sitio ...

Pierre.Vriens
fuente
3
Secundo esto. Sitio de respaldo. Mueva todos los módulos a nuevas carpetas. Ejecute la reconstrucción del registro en drush, o simplemente siga las instrucciones y navegue hasta el archivo php incluido para ejecutarlo. Simple.
Collins
2

Visite / admin / build / modules reconstruirá las rutas en la tabla del sistema. A veces, drupal ya no puede arrancar, por lo que esta solución no funciona en este caso. Si no funciona, puede usar Drush Rebuild Project Paths como se dijo en una respuesta anterior. Sin embargo, debe agregar el nuevo comando drush antes de romper el bootstrap. Para agregar el nuevo comando, consulte la sección COMANDOS del archivo Léame

Zatox
fuente
2

Tuve algunos problemas para drush dlno funcionar debido a los problemas del directorio del módulo. En general, me gustan las respuestas de la pila que simplemente puedo pegar para que todo funcione. Aquí encontrará un par de líneas que instalarán Drush Rebuild Registry y lo ejecutarán en su sitio si ya está en el directorio del sitio adecuado.

pushd ~  # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd 
drush rr
Fifi Finance
fuente
2

No estoy 100% seguro de una verdadera respuesta de drupal-esk, pero en mi experiencia:

Accidentalmente moví una de mis carpetas de módulos personalizados a otra carpeta de módulos personalizados cuando envié FTP al servidor. Ambos seguían trabajando. Drupal parecía haberlo reconocido como un módulo separado incluso mientras estaba en la carpeta de otro módulo. No tuve que deshabilitar el módulo.

** Este módulo que moví NO tenía un archivo .install, así que no estoy seguro de si eso importa.

Exziled
fuente
El archivo de instalación es solo para procedimientos llamados durante la instalación del módulo y no es un requisito. Funcionó porque puede tener cualquier estructura de carpetas en / sites / all / modules, drupal buscará los archivos .info de forma recursiva.
gbyte.co
@ gbyte.co gracias por la aclaración sobre eso! Conocía el archivo de instalación pero no conocía el proceso recursivo de drupal de búsqueda de archivos .info. Pensé que no importaba en qué subcarpeta se encontraran, ¡pero es bueno tener una respuesta sólida!
Exzilado el
1

Las distribuciones de Drupal no manejan esto bien, por lo que recientemente, después de terminar accidentalmente con una copia de Entity API en sites/all/un sitio de Panopoly, nada de esto funcionó. La reconstrucción del registro, la carga de la página de módulos y todo lo demás causó un error fatal.

Deshabilitar el módulo tampoco es simple si tiene que mover algo como Entity API, que es requerido por toneladas de otros módulos en Panopoly.

Para resolver esto, para Entity API haría algo como esto:

  1. Actualice la ruta en la tabla del sistema:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Luego reconstruya el registro:

    drush rr
ergophobe
fuente
1

Drupal 7

En primer lugar, inténtalo drush rr.

Si no funciona, después de mover los archivos, pruebe los siguientes comandos Drush en su directorio raíz de Drupal:

drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all

Si lo anterior no funciona, busque la tabla que todavía tiene la información anterior sobre la ruta:

drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.

Si no se encuentra ninguno, eso significa que es su caché externa.

Si es así, no olvide reiniciarlos, por ejemplo:

killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"

Ver más: ¿Qué método se utiliza para borrar cachés en Drupal?


Alternativamente, puede probar las siguientes consultas MySQL después de mover los archivos:

UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%" AND type = "module"
       AND name IN ("my", "module", "whose", "path", "changed");

UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%"
       AND module IN  ("my", "module", "whose", "path", "changed");
kenorb
fuente
1

Se recomienda mover sus módulos a subcarpetas contrib / dev / patched / custom. Sin embargo, no hay ganancias de rendimiento, esto se hace por razones prácticas y estéticas. Esto facilitará la vida de los futuros desarrolladores.

Puede mover la mayoría de los módulos contrib a subcarpetas sin problemas en un sitio en vivo. Debe limpiar los cachés después. Si no utiliza drush y descubre que ya no puede acceder a la página de limpieza de caché, deberá visitar /update.php o truncar manualmente las tablas de caché. Solo tuve que hacer el último bit al mover el módulo API de la entidad.

Mover módulos principales es técnicamente posible, pero no lo recomendaría ni veo ninguna razón válida para hacerlo.

Actualización: Mover módulos como la API de entidad puede requerir la reconstrucción del registro. Echa un vistazo a la página Registry_rebuild .

gbyte.co
fuente
-4

Simplemente puede agregar un enlace sym en el directorio de sites / all / modules apuntando a sites / all / contrib. No estoy seguro si resuelve tu problema. También hay otras soluciones, incluido el perfil de instalación o un archivo de creación drush. No sé lo suficiente como para proporcionar detalles sobre ellos, pero al menos es una dirección que puede mirar.

lexicante
fuente
55
Es un dolor de cabeza de mantenimiento a largo plazo
AgA
Este es un truco y soluciona el problema ... no es una buena solución.
iLLin
Sí, mucho mejor usar drush Registry_rebuild ahora que está disponible.
léxico