Magento 2: Run `setup: di: compile` ** เท่านั้น ** เป็นโมดูลเฉพาะ?


33

เป็นไปได้หรือไม่ที่จะสร้างโค้ดล่วงหน้าสำหรับโมดูลใดโมดูลหนึ่งโดยเฉพาะ? IE - ฉันสามารถสร้างรหัสทั้งหมดในระบบด้วย

php bin/magento setup:di:compile

อย่างไรก็ตามอาจใช้เวลานาน ฉันต้องการสร้างไฟล์ล่วงหน้าเฉพาะสำหรับโมดูลเฉพาะ

php bin/magento setup:di:compile Pulsestorm_Commercebug

ปัญหาเฉพาะที่ฉันพยายามแก้ไขคือการแก้ไขปัญหานี้โดยที่บางปลั๊กอินไม่ได้รับการยอมรับในโหมดผู้พัฒนา / ค่าเริ่มต้น


อัปเดตคำตอบของฉันหลังจากอ่านบทความ "คำถามเปิด" ล่าสุดของคุณ คำตอบสำหรับคำถามโดยตรงคือ: ไม่ การแก้ปัญหามันไม่ซับซ้อน มันไม่ได้ถูกนำไปใช้เพราะไม่เคยคิดว่าจำเป็น
Anton Kril

จะดีมากที่ได้รับความสามารถในการ 'คอมไพล์' ในโมดูลเดียวจะประหยัดเวลาได้มากเมื่อทำการดีบั๊กปัญหาในการพัฒนาโมดูล
Karen Baker

คำตอบ:


20

คำตอบสั้น ๆ : ไม่, ตอนนี้ไม่สามารถใช้เครื่องมือที่มาพร้อมกับ Magento ได้

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

การคอมไพล์สำหรับหนึ่งโมดูลไม่สมเหตุสมผลเนื่องจากวีโอไอพีจะไม่ทำงานกับการกำหนดค่าที่คอมไพล์แล้วสำหรับหนึ่งโมดูลเท่านั้น

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


1
มันเป็นความเจ็บปวดที่ต้องคอมไพล์ใหม่ทุกครั้งที่มีการเพิ่มอาร์กิวเมนต์การฉีดขึ้นใหม่ในที่ใดที่หนึ่งในระหว่างการพัฒนามีวิธีเลี่ยงการสร้างรหัสโดยสมบูรณ์ในระหว่างการพัฒนาหรือไม่?
snez

6
คุณไม่จำเป็นต้องเรียกใช้คอมไพเลอร์ระหว่างการพัฒนา คุณยังจะต้องล้างไดเรกทอรี / รุ่นหากคุณปรับเปลี่ยนลายเซ็นวิธี แต่ไม่จำเป็นต้องมีการรวบรวม การรวบรวมเป็นเพียงการสลับไปใช้การผลิตเท่านั้น
Anton Kril

12

ความสามารถในการbin/magentoปฏิบัติการของ Magento เป็นเพียงส่วนประกอบของ Symfony Console ซึ่งหมายความว่าคุณสามารถค้นหาไฟล์แต่ละไฟล์ที่เรียกคืนได้สำหรับคำสั่งเดียว การตั้งชื่อจะเหมือนกันเสมอดังนั้นสำหรับการตั้งค่า: di: คอมไพล์คุณสามารถค้นหา DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php)

มันจะเรียกใช้exeucte()เมธอดอยู่เสมอเพื่อที่เราจะต้องมองหา ในฟังก์ชั่นนี้คุณจะเห็นการ$operationsตั้งค่า var ซึ่งเต็มไปด้วยgetOperationsConfiguration()วิธีการ วิธีการนี้โดยทั่วไปจะบอก DiCompileCommand ว่าจะรวบรวมอะไร

สิ่งแรกที่ฉันพยายามจะคืนก็เป็นเพียงส่วนของตัวสร้างโค้ดแอปพลิเคชันเช่นนั้น

private function getOperationsConfiguration(
    array $compiledPathsList
) {
    $excludePatterns = [];
    foreach ($this->excludedPathsList as $excludedPaths) {
        $excludePatterns = array_merge($excludedPaths, $excludePatterns);
    }

    return [
        OperationFactory::APPLICATION_CODE_GENERATOR => [
            'paths' => [
                $compiledPathsList['application'],
                $compiledPathsList['library'],
                $compiledPathsList['generated_helpers'],
            ],
            'filePatterns' => ['php' => '/\.php$/'],
            'excludePatterns' => $excludePatterns,
        ]
    ];
}

นี่เป็นไปด้วยดีเวลารวบรวมก็ลดลงอย่างมาก

Compilation was started.
Application code generator... 1/1 [============================] 100% 45 secs 308.8 MiB
Generated code and dependency injection configuration successfully.

ตรงข้ามกับ;

Compilation was started.
Interception cache generation... 7/7 [============================] 100% 3 mins 377.0 MiBB8 MiB
Generated code and dependency injection configuration successfully.

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

คุณสามารถค้นหาเครื่องกำเนิดไฟฟ้าที่รับผิดชอบได้ที่นี่;

การติดตั้ง / src / วีโอไอพี / ติดตั้ง / โมดูล / Di / แอป / งาน / การดำเนินงาน /

แต่ละคลาสมี foreach อยู่ในนั้นซึ่งจะช่วยให้คุณเพิ่ม if / else ด้วยการข้ามโมดูล / พา ธ บางอย่างต่อไป อาจเป็นประโยชน์ในการตรวจสอบเอกสารประกอบอาร์กิวเมนต์ของอินพุตคอนโซลของ Symfonyเกี่ยวกับวิธีป้อนอาร์กิวเมนต์ลงในคำสั่ง


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

3

คุณสามารถรับรู้โดย

แพคเกจ> โมดูล> registration.php

<?php
use \Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Package_Module', __DIR__);

และกว่าวิ่ง

php -f bin / magento module: เปิดใช้งาน --clear-static-content Package_Module

register.php จะจดจำโมดูลและโมดูลที่กำหนดเองของคุณ

ฉันหวังว่านี่จะช่วยคุณได้


2
ข้อมูลที่เป็นประโยชน์ แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา ไม่ใช่เนื้อหาแบบคงที่ฉันต้องการรวบรวม แต่เป็นรุ่นที่ทำงานเมื่อคุณเรียกใช้ setup: di: compile นั่นคือสิ่งที่แตกต่าง
Alan Storm

-3

เมื่อคุณเปลี่ยนคอนสตรัคเตอร์ของคุณสำหรับคลาสที่สร้างขึ้นในคำขอก่อนหน้ามันจะพัง ถ้าคุณอยู่ในความต้องการดังกล่าวเพียงแค่ลบvar/cache, var/generationและvar/di(ถ้ามี) และรีเฟรชหน้าเว็บ ตรวจสอบให้แน่ใจว่าโหมดเป็นผู้พัฒนาที่คุณกำลังทำงาน

(ฉันไม่ได้พูดแบบนี้วีโอไอพีจะไม่คอมไพล์หรือสร้างโค้ดเบสใช่มันจะทำเช่นนี้มันช่วยให้รู้สึกโล่งใจเล็กน้อยจากการรัน "setup: di: compile" ทุกครั้งที่คุณทำการเปลี่ยนแปลงเส้นทางหรือคลาสของคุณ)


ดูเหมือนว่าจะตอบคำถามอื่น
Alan Storm

คำตอบที่ Anton Kril ได้ให้ไว้ข้างต้นนั้นตรงไปตรงมาและมีเหตุผลอย่างแท้จริง ฉันพยายามให้ทางเลือกอื่นซึ่งจะไม่ยอมให้คุณรัน command และดูหน้าจอของคุณจนกระทั่งคอมไพล์ run ทำวิธีนี้คุณสามารถประหยัดเวลาของคุณ คำตอบนั้นเกี่ยวข้องกับคำถามของคุณมาก หากนี่คือทัศนคติของคุณก็ไม่มีใครคิดวิธีแก้ปัญหาและความคิด
Laxman Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.