drush updatedb สำหรับโมดูลเดียว


28

เป็นไปได้ไหมที่จะใช้งานฟังก์ชั่นอัพเดทของโมดูลเดียวผ่าน drush? ฉันสามารถดูdrush updatedbว่าไม่ใช้ modulename เป็นอาร์กิวเมนต์และเรียกใช้การปรับปรุงที่มีอยู่ทั้งหมด จากนั้นจะdrush pm-updateตรวจสอบไฟล์ใหม่ด้วย เอกสารพูดว่า:

(เหมือนกับ pm-updatecode + updatedb)

สิ่งนี้หมายความว่าถ้าฉันเรียกใช้การdrush pm-updateอัปเดตที่มีอยู่ทั้งหมด (ใหม่กว่า update_function ออก) จะสมบูรณ์? มีวิธีการเพียง (db) อัปเดตหนึ่งโมดูลเท่านั้นหรือไม่


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

1
หนึ่งปีต่อมา. ฉันต้องการสิ่งนี้เพื่อสิ่งต่อไปนี้: ฉันได้สร้างโมดูลที่กำหนดเอง แต่ได้เปลี่ยนเค้าโครงของตารางในภายหลัง (ยังอยู่ในขั้นตอนการพัฒนา) ดังนั้นสิ่งนี้จะเป็นประโยชน์ถ้าฉันเพิ่งปรับปรุง db ด้วยสคีมาใหม่
Maarten Hartman

คำตอบ:


10

ไม่คุณไม่สามารถ

หากคุณต้องการอัปเดตแต่ละโมดูลด้วยตนเองให้อัปเดตไฟล์ของโมดูลเดียวเท่านั้นแล้วเรียกใช้ updatedb


ดูความคิดเห็นด้านล่างเกี่ยวกับการใช้งานdrush dl(คุณอาจต้องการลบโมดูลเก่าก่อนดังนั้นคุณจึงไม่ควรเก็บไฟล์เก่าไว้ซึ่งไม่ได้มีไว้สำหรับรุ่นใหม่!)
doublejosh

มีวิธีทำเช่นนี้นอกเหนือจากการดื่มเหล้าหรือไม่?
lathomas64

2
@ahimsauzi ให้คำตอบที่ถูกต้อง
cybercampbell

21

เมื่อวันที่ Drush 5.7 drush pm-update --no-core module-nameคุณสามารถเรียกใช้คำสั่ง Drush จะทำการสำรองโมดูลปัจจุบันโดยอัตโนมัติดาวน์โหลดเวอร์ชันใหม่และแจ้งให้คุณอัพเดทฐานข้อมูล


6
ซึ่งจะเรียกใช้การอัปเดตที่รอดำเนินการทั้งหมดไม่ใช่เฉพาะจากโมดูลที่คุณอัปเดต
moshe weitzman

Moshe สามารถชี้แจงได้ไหม ฉันรันคำสั่งด้านบนแล้วและถึงแม้ว่า Drush จะตรวจสอบการอัปเดตทั้งหมดที่รอดำเนินการ แต่โมดูลที่ระบุ (ชื่อโมดูลด้านบน) เท่านั้นที่จะได้รับการอัปเดต ฉันพลาดอะไรไปรึเปล่า?
ahimsauzi

6
จะตรวจสอบการอัปเดตรหัสที่ค้างอยู่ทั้งหมดและอัปเดตรหัสสำหรับโมดูลที่ระบุเท่านั้น แต่จะประมวลผลการอัพเดทฐานข้อมูลทั้งหมด
meustrus

8

หากคุณต้องการเรียกใช้การอัพเดตเดียวคุณสามารถเรียกใช้drush eval foo_update_33()ตัวอย่างเช่น ในทางปฏิบัติมันมีความซับซ้อนมากกว่านั้นเล็กน้อยเนื่องจากคุณต้องโหลดไฟล์. install แต่ไม่มาก

คุณสามารถลอง @macaleaa ทางออก:

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


3
ฉันจะเพิ่มว่ามันจะดีถ้ามีคนทำส่วนขยายของ Contrib สำหรับ Drush ที่ให้คุณเรียกใช้การอัปเดตที่เลือก นั่นไม่ใช่สิ่งที่ปลอดภัยที่ต้องทำโดยทั่วไป แต่บางครั้งคุณต้องมีชีวิตอยู่อย่างอันตราย ไม่เหมาะสำหรับแกน Drush แม้ว่า (ฉันเป็นผู้ดูแล Drush)
moshe weitzman

2
ทำไมจึงไม่เหมาะกับการเจาะหลัก? เป็นไปไม่ได้หรือที่บางคนต้องการบังคับใช้คำสั่งอัปเดตฐานข้อมูลเฉพาะ(สำหรับรหัสที่ดาวน์โหลดไปแล้ว) ซึ่งในกรณีนี้แต่ละโมดูลจะต้องได้รับการอัพเดตแยกต่างหาก ฉันอยู่ในสถานการณ์เช่นนี้เอง
meustrus

33 มาจากไหนที่นี่? เป็นชื่อเครื่องของโมดูลหรือไม่
lathomas64

33 เป็นส่วนหนึ่งของชื่อฟังก์ชั่นอัพเดทและกำหนดลำดับ และใช่ foo คือชื่อเครื่องของโมดูล คุณสามารถค้นหาฟังก์ชั่นใน foo.install ตัวอย่างเช่นโมดูล devel (ใน devel.install) มีฟังก์ชั่นการอัพเดทหลายอย่าง: function devel_update_7000เป็นฟังก์ชั่นที่มีจำนวนต่ำสุดและจะถูกดำเนินการก่อนจากนั้นจึงfunction devel_update_7001เป็นต้น
Ursula

3
นี่คือตัวอย่างที่โหลดไฟล์ติดตั้งก่อน:drush php-eval 'module_load_install('file_entity');file_entity_update_7211();'
mcaleaa

5

ค่าdrush up someprojectหรือdrush upc someprojectดูเหมือนดูเหมือนจะอัปเดตเฉพาะsomeprojectโมดูล วิธีที่แตกต่างในการทำสิ่งที่คุณต้องการคือ:

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

นี่คือการอภิปรายหัวข้อที่คล้ายกันใน Drupal.org ดูแล !


ฉันเพิ่งลองและใช้drush up someprojectงานได้ แต่น่าเสียดายที่มันตรวจสอบการอัปเดตทั้งหมดที่มีอยู่สำหรับโมดูลที่เปิดใช้งานโดยค่าเริ่มต้นด้วย (ซึ่งจะไม่จำเป็น) เขียน"อัปเดตที่มีอยู่"ให้กับบางคน แต่อัปเดตเฉพาะโครงการ นี่คือภาพหน้าจอ: i.imgur.com/TDDmB.png ในขณะที่คุณสามารถดูการปรับปรุงหลายมี แต่เพียง xmlsitemap drush up xmlsitemapได้รับการปรับปรุงโดยใช้
Sk8erPeter

4

ฉันใช้ Drush 5.9 และสามารถอัปเดตโมดูลเดียวได้สำเร็จด้วยคำสั่งนี้:

drush dl *project*

ตัวอย่างเช่นหากต้องการอัปเดตโมดูล 'devel':

drush up devel


0

ฉันมีสถานการณ์ที่ตารางที่สร้างขึ้นโดยฟังก์ชั่นการอัพเดท ( MYMODULE_update_7101) แต่ตารางนั้นถูกเข้าถึงในรหัสที่ใดที่หนึ่งในทุก ๆ แคชชัดเจนและเกือบทุกครั้งที่มีการเรียก อื่น). การรันdrush updatedbกำลังรันMYMODULE_update_7101อันดับสามแทนที่จะเป็นอันดับแรก

ฉันลองวิธีแก้ปัญหาที่แนะนำโดย @macaleaa และ @moshe weitzman ในการทำงาน:

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

ก่อนที่จะเรียกใช้drush updatedbแต่สิ่งนี้ไม่ได้ช่วย - การรันที่ล้มเหลวล้มเหลวเนื่องจากupdatedbลองอีกครั้งเพื่อเรียกใช้MYMODULE_update_7101()และแก้ไขข้อผิดพลาดโดยบอกว่ามีตารางอยู่แล้ว โดยทั่วไปโค้ดข้างต้นเรียกใช้การอัปเดต แต่ไม่ทิ้งเครื่องหมายไว้บนระบบที่เรียกใช้การอัปเดต สันนิษฐานว่ามีสิ่งอื่น ๆ มากมายที่update.phpต้องทำหลังจากเรียกใช้การอัปเดตแต่ละครั้งเพื่อเก็บหมายเลขเวอร์ชั่นล่าสุดสำหรับโมดูลในฐานข้อมูลเป็นต้น

ฉันผ่านupdate.phpไปเพื่อดูว่ามันใช้งานจริงสำหรับแต่ละฟังก์ชั่นการอัพเดทอย่างไรและมันทำงานอย่างไรโดยมองหาฟังก์ชั่นการโทรที่จะเรียกฟังก์ชั่นการอัพเดทและทำสิ่งอื่น ๆ ทั้งหมด ฉันได้รับสิ่งนี้:

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

ซึ่งฉันจริง ๆ แล้ววิ่งด้วย drush:

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

มันรันการอัปเดตไม่มีปัญหา แต่แล้ว MYMODULE รุ่น 7101 ยังคงปรากฏอยู่ในรายการอัปเดตเมื่อฉันวิ่งupdatedbแต่มันวิ่งโดยไม่มีข้อผิดพลาดและทุกอย่างดูดีในการตรวจสอบเว็บไซต์

บิตแฮ็คและ 6 ปีที่ผ่านมา แต่ทุกอย่างก็จบลงด้วยดี?

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