Як перемістити встановлені модулі з / сайтів / всіх / модулів / * до / сайтів / всіх / contrib / модулів / *


34

Я шукав відповіді на це питання, не маючи везіння. З того, що я спостерігаю в структурі бази даних, розташування модулів вказано в таблиці "система". Єдине рішення, яке я маю - це написати запит SQL для оновлення стовпця "ім'я файлу".

Чи є краще / більш чисте рішення у вирішенні цього питання, наприклад, модуль "contrib"?

Відповіді:


27

Вам потрібно лише перемістити модулі на нове місце та відновити реєстр. Коли реєстр відновиться, шлях до модулів буде оновлений. Перевірка registry_rebuild().

Відновлює весь код у модулях або включає каталоги, зберігаючи розташування кожного інтерфейсу чи класу в базі даних.

Хоча, я б рекомендував вам створити резервну копію бази даних, перш ніж перевірити це.

Якщо ви використовуєте "drush", ви також можете відновити реєстр за допомогою наступної команди:

drush cc registry

Ви також можете встановити registry_rebuildкоманду для drush:

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr

Якщо я правильно це зрозумів, ви також можете усікати свою registry_fileтаблицю, що змусить drupal перевмістити всі файли та відновити таблицю.
Cyclonecode

3
Обрізання таблиці звучить як погана ідея і, швидше за все, призведе до повністю зламаного сайту.
Бердір

@Berdir - Погодьтеся, що це звучить як погана ідея. Але, просто спробував це і, здається, працює. Спершу я взяв резервну копію і обрізав всю таблицю за допомогою DELETE FROM registry_file;та додав дзвінок rebuild_registry()у свій page.tpl.php.
Cyclonecode

Це над складно, просто роби те, що сказав Джон Лайн , для мене це завжди працює.
Джим Кіркпатрік

1
@JimKirkpatrick - Ти маєш рацію, що не потрібно відключати модулі.
Циклонекод

10

Я відновив резервну копію з виробництва локально і спробував просто перемістити речі і натиснути адміністратор / модулі або запустити register_rebuild (), але це не зупинило відкидання фатальних помилок. Це має сенс для мене, оскільки деякі модулі можуть використовувати включені або що-небудь у їхньому_ук_ініт (), або у вас може бути встановлений шлях маршрутизатора до меню, який залежить від модуля, або включати те, що Drupal не може знайти під час завантаження. Зрештою, це я зробив (ваші шляхи можуть бути різними):

Крок 1: Замініть сайти / всі / модулі сайтами / усі / модулі / внесок

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');

Крок 2: Замініть сайти / всі / модулі / допишіть сайти / всі / модулі / власні для модулів, розміщених назви

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_%';

Крок 3: Перемістіть модулі розробки на сайти / all / module / 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%';

Крок 4: Очистіть кеші, щоб речі завантажилися належним чином

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

Примітка: Якщо для обробки 403 (доступ заборонено) ви користуєтеся спеціальним модулем або дописом, таким як LoginToboggan, і ви вийшли з системи, під час цього процесу вам може знадобитися оновити include_fileстовпець у menu_roterтаблиці, щоб використовувати новий шлях для файлу включення . Це, мабуть, рідкісне явище.

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

Після запуску цих запитів - що займе лише частку секунди - натисніть адміністратор / config / development / performance та очистіть кеш, щоб шляхи меню відновилися.


Дякую за це! Я спробував кроки, згадані у головних відповідях, але це не допомогло в моєму випадку. Я підозрюю, що будь-хто на веб-сайті, що розміщений у Пантеоні, повинен виконати ці твердження db у вашій відповіді, а потім зробити "реструктуризацію реєстру друку" та "реєстр drush cc"
Енн Бонхем,

Так і на Pantheon, я не міг отримати сайт із модулем Redis ніде, окрім сайтів / all / модулів - тому я просто здався і залишив цей один модуль у папці кореневих модулів. Ну добре - принаймні інші мої модулі чудово організовані.
Енн Бонхем

Для тих, хто використовує LoginToboggan, ось 3 потрібні вам команди MySQL: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

Спробуйте класний інструмент від Mark Sonnabaum: Drush Rebuild Project Paths . Це автоматизує процес; працював чудово для мене. Звичайно , використовує Друш .

Я буду другою пропозицією спробувати це на копії бази даних вашого сайту.


7

Для запису існує чудова команда "перезавантажити" для відновлення реєстру: http://drupal.org/project/registry_rebuild

На сторінці проекту багато інформації.


Це мій найбільш бажаний метод переміщення модулів. У мене було ввімкнено кілька модулів, в sites/all/modulesяких довелося перенести в contribпідкаталог. Все, що мені потрібно було,drush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek,

Це працювало для мене. Спершу я перемістив усі свої модулі, потім зробив
register_rebuild

Цікаво, що drush rr --fire-bazookaпризводить до помилок, але drush rrдобре.
Олексій Скрипник

5

По-перше, завжди створюйте резервну копію вашої бази даних, настільки просто це зробити, ви б’єте себе, якщо щось піде не так, а ви не зробили резервну копію.

Я не впевнений, чи це має значення, вимкнути модулі чи ні; ви можете зробити це, про всяк випадок. Потім зробіть це:

  1. Переведіть свій сайт у режим обслуговування за адресою (назва сайту) / адміністратор / конфігурація / розробка / обслуговування
  2. Фізично переміщуйте свої модулі у файловій системі.
  3. Очистіть кеші за адресою (ім'я сайту) / адміністратора / конфігурації / розробки / продуктивності або просто збережіть сторінку модулів.

Готово! Drupal повторно шукатиме всі встановлені модулі.


+1 для режиму
vzdržece

1
Це спричиняє фатальні помилки в 100% часу для мене. Можливо, це спрацює, якщо ви переміщуєте модулі, у яких немає залежностей чи чогось іншого.
ергофоб

4

Чому б не спробувати модуль " Перебудова реєстру" . Це працювало щоразу для мене.

Ось цитата про це (зі сторінки проекту модуля):

У Drupal 7 бувають випадки, коли реєстр отримує безнадійне захоплення, і вам потрібно відновити реєстр (список класів PHP та файли, з якими вони йдуть). Однак іноді ви не можете виконувати цю регулярну кеш-операцію, оскільки потрібен певний клас, коли система намагається завантажувати.


Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки. Якщо є процедура переміщення модулів, яка включає використання модуля, який ви зв'язали, опишіть його.
Молот

Ніякої теорії ... це працює. Дотримуйтесь інструкцій на сторінці. Я використовував метод ударних, і він просто працював.
iLLin

3

Ви можете використовувати модуль Rebuild Rebuild , який інтегрується з Drush за допомогою Drush RRкоманди.

В основному, ти робиш ці кроки:

  1. Перемістіть свої модулі в інший каталог та
  2. Після цього Registry Rebuild відновить системну таблицю, щоб встановити модулі в потрібне місце.

Я вперше дізнався / відкрив це через DrupalEasy Podcast № 133 , де далі пояснюється, як цей модуль / dush cmd може бути використаний.

PS: Звичайно, спочатку виконайте резервну копію свого сайту ...


3
Я другий це. Резервне копіювання сайту. Перемістіть усі модулі в нові папки. Запустіть відновлення реєстру в друку або просто дотримуйтесь інструкцій та перейдіть до доданого файлу php, щоб запустити його. Простий.
Коллінз

2

Відвідайте / admin / build / модулі, це відновить шляхи в системній таблиці. Іноді drupal більше не може завантажуватися, тому це рішення не працює в цьому випадку. Якщо це не спрацює, ви можете скористатись проектами Drush Rebuild Project Paths, як сказано в попередній відповіді. Ви повинні додати нову команду drush перед тим, як зламати завантажувальну систему. Щоб додати нову команду, перегляньте розділ КОМАНДИ readme


2

У мене виникли проблеми з drush dlнероботою через проблеми з каталогом модулів. Як правило, мені подобаються відповіді на стеки, які я можу просто вставити, щоб працювати. Тут ви знайдете пару рядків, які встановлять реєстр Drush Rebuild і запустять його на вашому сайті, якщо ви вже знаходитесь у відповідному каталозі сайту.

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

2

Я не впевнений на 100% у справжній відповіді drupal-esk, але, на моєму досвіді:

Я випадково перемістив одну з моїх спеціальних папок модулів у іншу спеціальну папку модулів під час FTPing на сервер. Вони обоє ще працювали. Drupal, здавалося, визнав його окремим модулем, навіть коли він знаходився в папці іншого модуля. Мені не довелося відключати модуль.

** У цьому модулі, який я перемістив, НЕ був файл .install, тому я не впевнений, що це має значення.


Файл встановлення призначений лише для процедур, викликаних під час встановлення модуля, і не є вимогою. Це спрацювало, тому що ви можете мати будь-яку структуру папок під / sites / all / module, drupal буде шукати файли .info рекурсивно.
gbyte.co

@ gbyte.co дякую за пояснення з цього приводу! Я знав про інсталяційний файл, але не знав рекурсивного процесу друпалу для пошуку .info файлів. Я подумав, що не має значення, в якій папці вони знаходилися, але добре мати ґрунтовну відповідь!
Заслано

1

Drupal дистрибутиви не впоратися з цим добре, тому в останній час після того, як випадково в кінцевому підсумку з копією Entity API в sites/all/на сайті Panopoly, жоден з цього працював. Поновлення реєстру, завантаження сторінки модулів та все інше спричинило фатальну помилку.

Відключення модуля не є простим, якщо вам потрібно перенести щось на зразок Entity API, що вимагається набором інших модулів в Panopoly.

Щоб вирішити це, для Entity API ви зробили б щось подібне:

  1. Оновіть шлях у системній таблиці:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Потім відновіть реєстр:

    drush rr

1

Drupal 7

Перш за все спробуйте drush rr.

Якщо це не спрацює, після переміщення файлів спробуйте наступні команди Drush у вашому кореневому режимі 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

Якщо вище не працює, знайдіть таблицю, у якій ще є стара інформація про шлях за:

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

Якщо нічого не знайдено, це означає, що це ваш зовнішній кеш.

Якщо це так, не забудьте перезапустити їх, наприклад:

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

Дивіться докладніше: Який метод використовується для очищення кеш-пам'яті в Drupal?


Ви також можете спробувати наступні запити MySQL після переміщення файлів:

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");

1

Рекомендується переміщення модулів у підпапки contrib / dev / patched / custom. Однак підвищення продуктивності не відбувається, це робиться з практичних та естетичних міркувань. Це полегшить життя майбутніх розробників.

Ви можете переміщати більшість модулів contrib до папок без проблем на реальному сайті. Ви повинні очистити кеші після цього. Якщо ви не використовуєте "drush" і виявите, що більше не можете отримати доступ до сторінки очищення кешу, вам доведеться відвідати /update.php або вручну обрізати таблиці кешу. Мені довелося робити останній біт під час переміщення модуля API сутності.

Переміщення основних модулів технічно можливо, але я б не рекомендував цього, ні я не бачу вагомих причин для цього.

Оновлення: переміщення модулів, таких як API особи, може вимагати відновлення реєстру. Перегляньте сторінку register_rebuild .


-4

Ви можете просто додати символьне посилання у довіднику сайтів / всіх / модулів, що вказує на сайти / all / contrib. Я не впевнений, чи вирішує це ваша проблема. Є й інші рішення, включаючи інсталяційний профіль або файл "drush make". Я не знаю достатньо, щоб надати детальну інформацію про них, але принаймні це напрямок, який ви можете подивитися.


5
Це головний біль, що підтримує, в довгостроковій перспективі
AgA

це злом і йде навколо виправлення ... не вдале рішення.
iLLin

Так набагато краще використовувати drush register_rebuild тепер, коли він доступний.
лексикант
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.