Score:0

วิธีการติดตั้งโมดูลใหม่ เพิ่มโค้ดให้กับโมดูลที่มีอยู่ซึ่งต้องการโมดูลใหม่ และนำเข้าการกำหนดค่าสำหรับโมดูลใหม่ในบิลด์เดียวกัน

ธง hk

ฉันดูเหมือนจะประสบปัญหาการพึ่งพาแบบวงกลมในสถานการณ์ที่บิลด์ใหม่ของฉันมีโมดูลใหม่ (B) รหัสใหม่ในโมดูลที่มีอยู่ (A) ที่ขึ้นอยู่กับโมดูลใหม่ (B) และการกำหนดค่าใหม่ที่นำเข้าสำหรับ โมดูลใหม่ (B)

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

มีวิธีจัดการที่ดีกว่านี้ไหม

การเปลี่ยนแปลงในโมดูล A คือบริการหนึ่งในโมดูล A ต้องใช้บริการจากโมดูล B

ฉันได้เพิ่มการพึ่งพาไปยังโมดูล B ใหม่ในไฟล์ module_A.info.yml แล้ว แต่นั่นไม่ได้ช่วยอะไรเนื่องจากติดตั้งโมดูลแล้ว

drush และ module_b ไม่ทำงานและทำให้เกิดข้อผิดพลาด

บริการ "module_A_service" มีการพึ่งพาบริการที่ไม่มีอยู่จริง "module_B_service"

การนำเข้าการกำหนดค่าที่อยู่ในบิลด์มีการอัปเดต core.extensions เพื่อเปิดใช้งาน module_B เมื่อนำเข้า แต่นำเข้าการกำหนดค่าด้วย ซิม ล้มเหลวด้วยข้อผิดพลาดเดียวกันกับด้านบน

id flag
ฉันได้ทำในสิ่งที่คุณทำ คุณยังสามารถนึกถึงการตรวจหาโมดูลหรือบริการอื่นและถอยกลับไปใช้พฤติกรรมพื้นฐานบางอย่าง
cn flag
ดูเหมือนว่าคุณต้องการเพิ่ม `hook_update_N` ใน module_A เพื่อติดตั้ง module_B
hk flag
ขอบคุณสำหรับคำตอบ @cilefen การขึ้นต่อกันของบริการนั้นยากในแบบที่เพิ่มการขึ้นต่อกันในไฟล์ yml หรือไม่
hk flag
ขอบคุณสำหรับการตอบสนอง @Clive - ฉันไม่ได้ลองอย่างชัดเจน แต่ฉันลอง drush php eval ของ \Drupal::service('module_installer')->install(['module_b']); นั่นทำให้เกิดข้อผิดพลาดเดียวกัน มันจะทำงานแตกต่างกันใน hook_update ฉันสามารถลองได้เช่นกัน
Jaypan avatar
de flag
ข้อผิดพลาดระบุว่าบริการ A ของคุณมีการขึ้นต่อกันที่ไม่มีอยู่ ซึ่งไม่ใช่การขึ้นต่อกันแบบวงกลม จะเกิดข้อผิดพลาดอะไรหากคุณปรับใช้ทุกอย่างในหนึ่งคอมมิชชัน แทนที่จะแยกออกเป็นสองส่วน
hk flag
ขอบคุณสำหรับคำตอบของคุณ @Jaypan drush cr ล้มเหลวด้วยข้อผิดพลาดข้างต้น drush cim ก็ล้มเหลวด้วยข้อผิดพลาดเดียวกัน drush updb ทำงาน แต่แสดงข้อผิดพลาดเดียวกัน ฉันไม่ได้ปรับใช้สิ่งนี้ในหลายบิลด์ ฉันกำลังปรับใช้ในบิลด์เดียว สิ่งที่ฉันพูดคือฉันมักจะแก้ไขปัญหานี้ด้วยสองบิลด์และพยายามคิดหาวิธีที่ดีในการแก้ไขปัญหานี้ในบิลด์เดียว
Jaypan avatar
de flag
หากเป็นการปรับใช้ครั้งเดียว ให้ลองใช้ Drush เพื่อเปิดใช้งานโมดูล B ก่อน จากนั้นเรียกใช้ `drush updb`
hk flag
drush en module_b ล้มเหลวโดยมีข้อผิดพลาดเดียวกับด้านบน อย่างไรก็ตาม ฉันดำเนินการต่อและเพิ่ม hook update ด้วย \Drupal::service('module_installer')->install(['module_b']); เช่นเดียวกับสิ่งที่ @Clive แนะนำ ดำเนินการโดยไม่มีข้อผิดพลาดและติดตั้งโมดูล ดังนั้นวิธีแก้ไขคือเพิ่มการอัพเดต hook เพื่อเปิดใช้งานโมดูลที่ต้องพึ่งพาอย่างชัดเจนแม้ว่าบิลด์จะมีการกำหนดค่าเพื่อเปิดใช้งานโมดูลในภายหลัง
cn flag
ฉันคิดว่า `updb` ทำงานภายใต้โหมดบูทสแตรปที่แตกต่างกัน ดังนั้นมันจึงคุ้มค่าที่จะลองถ้าคุณสามารถทดสอบก่อนได้ (เพียงแค่ดึง DB/ไฟล์สาธารณะลงและรันในเครื่องก็ควรให้คุณทำเช่นนั้น) ฉันค่อนข้างแน่ใจว่าฉันเคยทำสิ่งนี้มาก่อนเพื่อแก้ปัญหาเดียวกัน อาจไม่ได้ทำ `drush cr` ก่อน `updb` ดังนั้นระบบจะไม่มีโอกาสสร้างแคชของปลั๊กอินใหม่จนกว่าจะเปิดใช้งานโมดูล
hk flag
ขอบคุณ @ไคลฟ์ นั่นไม่ได้หลอกลวง
Score:1
ธง hk

นี่คือวิธีแก้ปัญหาที่ได้ผล

ก) ใช้ hook_update_N ในโมดูล A ที่ติดตั้งไว้แล้วใน hook_update_N เพิ่มโค้ดเพื่อติดตั้ง module_b รวมไว้ในบิลด์เดียวกัน

ฟังก์ชัน module_a_update_NNNN(&$ แซนด์บ็อกซ์) {
  $module_installer = \Drupal::service('module_installer');
  $module_handler = \Drupal::service('module_handler');
  ถ้า (!$module_handler->moduleExists('module_b')) {
    $module_installer->install(['module_b']);
  }
}

b) ปรับใช้บิลด์

c) อย่าล้างแคช หากคุณเรียกใช้ cache clear ก่อน updb จะเกิดข้อผิดพลาดเดียวกันกับที่กล่าวถึงในคำถาม

ง) วิ่ง drush updb

จ) วิ่ง ซิม

ฉ) วิ่ง ดรัช cr

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา