วิธีย้ายโมดูลที่ติดตั้งจาก / sites / all / modules / * ถึง / sites / all / contrib / modules / *


34

ฉันค้นหาคำตอบสำหรับคำถามนี้โดยไม่มีโชคเลย จากสิ่งที่ฉันสังเกตเห็นในโครงสร้างฐานข้อมูลที่ตั้งไปยังโมดูลที่ระบุไว้ในตาราง 'ระบบ' ทางออกเดียวที่ฉันมีคือการเขียนแบบสอบถาม SQL เพื่ออัปเดตคอลัมน์ 'ชื่อไฟล์'

มีวิธีแก้ปัญหาที่ดีกว่า / ดีกว่าในการแก้ปัญหานี้เช่นโมดูล contrib หรือไม่?

คำตอบ:


27

คุณจะต้องย้ายโมดูลของคุณไปยังตำแหน่งใหม่ของคุณและสร้างการลงทะเบียนใหม่ เมื่อรีจิสตรี้พา ธ ไปยังโมดูลจะได้รับการอัพเดตอีกครั้ง registry_rebuild()ตรวจสอบ

Rescans รหัสทั้งหมดในโมดูลหรือรวมถึงไดเรกทอรีจัดเก็บตำแหน่งของแต่ละอินเตอร์เฟซหรือชั้นเรียนในฐานข้อมูล

แม้ว่าฉันจะแนะนำให้คุณสำรองฐานข้อมูลของคุณก่อนที่จะทดสอบนี้

หากคุณกำลังใช้ 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

@Berdir - ยอมรับว่ามันดูเหมือนความคิดที่ไม่ดี แต่เพียงลองใช้และดูเหมือนว่าจะทำงาน ครั้งแรกที่ผมเอาการสำรองข้อมูลและตัดทอนทั้งตารางการใช้DELETE FROM registry_file;และเพิ่มการเรียกร้องให้ในของฉันrebuild_registry() page.tpl.php
Cyclonecode

มันซับซ้อนเกินกว่าเพียงทำในสิ่งที่ John Laineพูดเอาไว้ใช้กับฉันเสมอ
Jim Kirkpatrick

1
@JimKirkpatrick - คุณพูดถูกไม่จำเป็นต้องปิดการใช้งานโมดูล
Cyclonecode

10

ฉันกู้คืนข้อมูลสำรองจากการผลิตในเครื่องและพยายามย้ายสิ่งต่าง ๆ และกด admin / modules หรือเรียกใช้ registry_rebuild () แต่ไม่ได้หยุดข้อผิดพลาดร้ายแรงจากการถูกโยนทิ้ง สิ่งนี้สมเหตุสมผลสำหรับฉันเนื่องจากบางโมดูลอาจใช้การรวมหรือสิ่งใดก็ตามใน hook_init () หรือคุณอาจมีชุดเราเตอร์เมนูพา ธ ที่ขึ้นอยู่กับโมดูล ในที่สุดนี่คือสิ่งที่ฉันทำ (เส้นทางของคุณอาจแตกต่างกัน):

ขั้นตอนที่ 1: แทนที่ sites / all / modules ด้วย sites / all / modules / 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');

ขั้นตอนที่ 2: แทนที่ sites / all / modules / contrib ด้วย sites / all / modules / custom สำหรับ Custom namespaced modules

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: ย้ายโมดูล dev ไปยังไซต์ / all / modules / 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

หมายเหตุ:หากคุณใช้โมดูลที่กำหนดเองหรือ contrib เช่น LoginToboggan เพื่อจัดการ 403 (การเข้าถึงถูกปฏิเสธ) และคุณได้ออกจากระบบในระหว่างกระบวนการนี้คุณอาจต้องอัปเดตinclude_fileคอลัมน์ในmenu_roterตารางเพื่อใช้พา ธ ใหม่สำหรับไฟล์ include . นี่อาจเป็นเหตุการณ์ที่เกิดขึ้นได้ยาก

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

เมื่อคิวรีเหล่านี้ทำงาน - ซึ่งจะใช้เวลาเพียงเสี้ยววินาทีเท่านั้น - เข้าชม admin / config / development / performance และล้างแคชเพื่อให้พา ธ เมนูสร้างขึ้นมาใหม่


ขอบคุณสำหรับสิ่งนี้! ฉันลองขั้นตอนที่กล่าวถึงในคำตอบยอดนิยม แต่นั่นไม่ได้ช่วยในกรณีของฉัน ฉันสงสัยว่าทุกคนในไซต์ที่โฮสต์โดย Pantheon จำเป็นต้องดำเนินการตามคำสั่ง db ในคำตอบของคุณจากนั้นทำ "drush registry-rebuild" และ "drush cc registry"
Anne Bonham

โอ้และบนแพนธีออนฉันไม่สามารถทำให้ไซต์ด้วยโมดูล Redis ได้ทุกที่ยกเว้น sites / all / modules - ดังนั้นฉันจึงยอมแพ้และทิ้งโมดูลนี้ไว้ในโฟลเดอร์ root modules อ่า - อย่างน้อยโมดูลอื่น ๆ ของฉันก็ถูกจัดอย่างดี
Anne Bonham

สำหรับผู้ที่ใช้ LoginToboggan ต่อไปนี้เป็นคำสั่ง MySQL 3 คำสั่งที่คุณต้องการ: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

ลองใช้เครื่องมือเย็นจากมาร์ค Sonnabaum: Drush สร้างเส้นทางโครงการ มันเป็นกระบวนการอัตโนมัติ ทำงานได้ดีสำหรับฉัน ใช้Drushแน่นอน

ฉันจะแนะนำให้คุณลองทำตามนี้ในสำเนาของฐานข้อมูลไซต์ของคุณ


7

สำหรับเร็กคอร์ดมีคำสั่ง drush ที่ยอดเยี่ยมในการสร้างรีจิสตรีใหม่: 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

สิ่งนี้ใช้ได้สำหรับฉัน ฉันย้ายโมดูลทั้งหมดของฉันก่อนแล้วจึงทำการ registry_rebuild
gerl

น่าสนใจdrush rr --fire-bazookaนำไปสู่ข้อผิดพลาด แต่drush rrใช้ได้
Alex Skrypnyk

5

ประการแรกสำรองฐานข้อมูลของคุณเสมอทำง่าย ๆ คุณจะเตะตัวเองถ้ามีอะไรผิดปกติและคุณไม่ได้สำรองข้อมูล

ฉันไม่แน่ใจว่ามันสำคัญถ้าคุณปิดการใช้งานโมดูลหรือไม่ คุณอาจต้องการที่จะทำมันในกรณีที่ จากนั้นทำสิ่งนี้:

  1. ทำให้ไซต์ของคุณอยู่ในโหมดบำรุงรักษาที่ (ชื่อไซต์) / admin / config / development / maintenance
  2. ย้ายโมดูลของคุณในระบบไฟล์
  3. ล้างแคชของคุณที่ (sitename) / admin / config / development / performance หรือเพียงแค่บันทึกหน้าโมดูลของคุณอีกครั้ง

เสร็จเรียบร้อย! Drupal จะค้นหาโมดูลที่ติดตั้งใหม่ทั้งหมดอีกครั้ง


+1 สำหรับโหมด maintaince ยินดีที่จะทำสิ่งนี้ก่อนสิ่งเช่นนี้
เสมอ

1
ซึ่งทำให้เกิดข้อผิดพลาดร้ายแรงถึง 100% สำหรับฉัน อาจใช้งานได้ถ้าคุณย้ายโมดูลที่ไม่มีการพึ่งพาหรือบางสิ่งบางอย่าง
ergophobe

4

ทำไมคุณไม่ลองใช้โมดูลRegistry Rebuild มันใช้ได้ทุกครั้งสำหรับฉัน

นี่คือคำพูดเกี่ยวกับมัน (จากหน้าโครงการของโมดูล):

มีบางครั้งใน Drupal 7 เมื่อรีจิสตรีได้รับการ hosed อย่างสิ้นหวังและคุณต้องสร้างรีจิสตรีใหม่ (รายการคลาส PHP และไฟล์ที่ไปด้วย) อย่างไรก็ตามในบางครั้งคุณไม่สามารถทำกิจกรรมแคชล้างปกตินี้ได้เนื่องจากบางคลาสจำเป็นเมื่อระบบพยายามบู๊ตสแตรป


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง หากมีขั้นตอนสำหรับการย้ายโมดูลที่รวมถึงการใช้โมดูลที่คุณเชื่อมโยงโปรดอธิบาย
Mołot

ไม่มีทฤษฎี ... มันใช้งานได้ ทำตามคำแนะนำในหน้า ฉันใช้วิธี drush และใช้งานได้
iLLin

3

คุณสามารถใช้โมดูลRegistry Rebuildซึ่งทำงานร่วมกับ Drush ผ่านDrush RRคำสั่ง

โดยทั่วไปสิ่งที่คุณทำคือขั้นตอนเหล่านี้:

  1. ย้ายโมดูลของคุณไปยังไดเรกทอรีอื่นและ
  2. การสร้างรีจิสทรีใหม่จะสร้างตารางระบบใหม่เพื่อรับโมดูลในตำแหน่งที่ถูกต้อง

ฉันเรียนรู้ / ค้นพบครั้งแรกผ่านDrupalEasy Podcast # 133ซึ่งอธิบายเพิ่มเติมว่าโมดูล / drush cmd นี้สามารถใช้งานได้อย่างไร

PS: แน่นอนก่อนอื่นทำการสำรองเว็บไซต์ของคุณ ...


3
ฉันที่สองนี้ สำรองไซต์ ย้ายโมดูลทั้งหมดไปยังโฟลเดอร์ใหม่ เรียกใช้การสร้างรีจิสทรีใหม่ใน drush หรือเพียงทำตามคำแนะนำแล้วไปที่ไฟล์ php ที่รวมไว้เพื่อเรียกใช้ ง่าย
Collins

2

เยี่ยมชม / admin / สร้าง / โมดูลมันจะสร้างเส้นทางในตารางระบบ บางครั้ง drupal ไม่สามารถ bootstrap ได้อีกต่อไปดังนั้นวิธีนี้จะไม่สามารถใช้งานได้ในกรณีนี้ ถ้ามันไม่ทำงานคุณสามารถใช้ Drush Rebuild Project Pathsตามที่กล่าวไว้ในคำตอบก่อนหน้า คุณต้องเพิ่มคำสั่ง drush ใหม่ก่อนที่จะทำลาย bootstrap ในการเพิ่มการตรวจสอบคำสั่งใหม่ออกREADME 's ส่วนคำสั่ง


2

ฉันมีปัญหากับการdrush dlไม่ทำงานเนื่องจากปัญหาไดเรกทอรีโมดูล โดยทั่วไปฉันชอบคำตอบสแต็คที่ฉันสามารถวางเพื่อให้สิ่งที่ทำงาน ที่นี่คุณจะพบบรรทัดสองสามบรรทัดที่จะติดตั้ง Drush Rebuild Registry และเรียกใช้บนไซต์ของคุณหากคุณอยู่ในไดเรกทอรีไซต์ที่เหมาะสมแล้ว

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 / modules drupal จะมองหาไฟล์. info ซ้ำ ๆ
gbyte.co

@ gbyte.co ขอบคุณสำหรับคำชี้แจงในเรื่องนั้น! ฉันรู้เกี่ยวกับไฟล์ติดตั้ง แต่ไม่ทราบว่ากระบวนการค้นหาแบบซ้ำของ drupal กำลังค้นหาไฟล์. info ฉันคิดว่ามันไม่สำคัญว่าพวกเขาอยู่ในโฟลเดอร์ย่อยใด แต่เป็นเรื่องดีที่ได้รับคำตอบที่ชัดเจน
Exziled

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 ต่อไปนี้ใน dir root ของ 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 เอนทิตีอาจต้องมีการสร้างรีจิสทรีใหม่ ลองดูหน้าregistry_rebuild


-4

คุณสามารถเพิ่มลิงก์ sym ในไซต์ / ทั้งหมด / โมดูลที่ชี้ไปยังไซต์ / ทั้งหมด / contrib ฉันไม่แน่ใจว่ามันจะแก้ปัญหาของคุณ มีวิธีแก้ไขปัญหาอื่น ๆ รวมถึงโปรไฟล์การติดตั้งหรือไฟล์ทำ drush ฉันไม่รู้พอที่จะให้รายละเอียดเกี่ยวกับพวกเขา แต่อย่างน้อยก็เป็นทิศทางที่คุณสามารถดูได้


5
มันปวดหัวบำรุงรักษาในระยะยาว
AgA

นี่คือแฮ็คและไปแก้ไข ... ไม่ใช่ทางออกที่ดี
iLLin

ดีกว่าการใช้ drush registry_rebuild ทันทีที่พร้อมใช้งาน
lexicant
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.