Magento 2: Jalankan `setup: di: compile` ** only ** a Specific Module?

33

Apakah mungkin untuk membuat kode sebelumnya untuk satu modul tertentu? IE - Saya dapat menghasilkan semua kode dalam sistem dengan

php bin/magento setup:di:compile

Namun, ini bisa memakan waktu lama. Saya ingin pra-menghasilkan hanya file untuk modul tertentu.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Masalah khusus yang saya coba selesaikan adalah mengatasi masalah ini dengan beberapa plugin yang tidak dikenali dalam mode pengembang / default.

Alan Storm
sumber
Memperbarui jawaban saya setelah membaca artikel "Pertanyaan Terbuka" terbaru Anda. Jawaban langsung atas pertanyaan adalah: tidak. Itu tidak rumit untuk dipecahkan. Itu hanya tidak dilaksanakan karena tidak pernah dianggap perlu.
Anton Kril
akan lebih bagus untuk mendapatkan kemampuan untuk 'mengkompilasi' pada satu modul, akan menghemat banyak waktu ketika debugging masalah dalam pengembangan modul.
Karen Baker

Jawaban:

20

Jawaban Singkat: Tidak. Itu tidak mungkin dengan alat yang dikirim bersama Magento sekarang.

Penjelasan: Kita harus membedakan pembuatan dan kompilasi kode . Compiler melakukan keduanya. Untuk kedua operasi kita perlu membaca konfigurasi semua modul magento lainnya, jika tidak outputnya akan salah atau tidak penuh.

Kompilasi untuk satu modul tidak masuk akal, karena magento tidak akan berfungsi dengan konfigurasi yang dikompilasi untuk satu modul saja.

Pembuatan untuk satu modul mungkin masuk akal, tetapi kita harus membaca konfigurasi dan tanda tangan konstruktor dari semua modul lainnya yang terpasang. Tanpa itu tidak semua kode dapat dihasilkan. Jadi operasi seperti itu tidak akan jauh lebih cepat daripada kompilasi penuh. Kami mungkin memikirkannya, tapi saya pikir bug yang Anda referensikan akan diperbaiki sebelum perintah diimplementasikan.

Anton Kril
sumber
1
itu seperti sakit harus mengkompilasi ulang setiap kali argumen injeksi ketergantungan baru ditambahkan di suatu tempat selama pengembangan, apakah ada cara untuk benar-benar mem-bypass pembuatan kode selama pengembangan?
snez
6
Anda tidak perlu menjalankan kompiler selama pengembangan. Anda masih harus menghapus / membuat direktori jika Anda memodifikasi tanda tangan metode, tetapi tidak diperlukan kompilasi. Kompilasi hanya untuk beralih ke produksi.
Anton Kril
12

bin/magentoEksekusi Magento hanyalah komponen Symfony Console. Ini berarti Anda dapat menemukan file individu bertanggung jawab untuk satu perintah. Penamaannya selalu sama sehingga untuk setup: di: compile Anda dapat menemukan DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Itu akan selalu menjalankan exeucte()metode sehingga di situlah kita perlu melihat. Dalam fungsi ini, Anda akan melihat $operationsvar diatur, yang diisi oleh getOperationsConfiguration()metode ini. Metode ini pada dasarnya memberi tahu DiCompileCommand apa yang harus dikompilasi.

Hal pertama yang saya coba adalah mengembalikan hanya bagian generator kode aplikasi, seperti itu;

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,
        ]
    ];
}

Ini berjalan cukup baik, waktu kompilasi berkurang secara dramatis;

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

Sebagai lawan;

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

Tentu saja, ini sudah diduga karena kami memotong beberapa hal. Tetapi Anda tidak menentukan file mana yang ingin Anda buat. Tidak semua file dapat dihasilkan berdasarkan per-modul, karena misalnya, kelas Interception dapat bergantung pada beberapa modul dan karenanya akan memberi Anda output fungsionalitas yang terbatas jika Anda hanya menjalankan ini untuk satu modul.

Anda dapat menemukan generator yang bertanggung jawab di sini;

setup / src / Magento / Setup / Modul / Di / App / Tugas / Operasi /

Setiap kelas memiliki foreach di dalamnya, yang akan memungkinkan Anda untuk menambahkan if / else dengan terus melewati modul / jalur tertentu. Mungkin akan berguna untuk memeriksa dokumentasi Argumen Input Komponen Symfony Konsol tentang cara memasukkan argumen ke dalam perintah.

Peter Jaap Blaakmeer
sumber
+1 untuk informasi yang bermanfaat, tetapi ulang: "Tapi Anda tidak menentukan file mana yang ingin Anda buat". Secara teknis itu benar, tetapi tersirat dalam pertanyaan adalah keinginan untuk membuat mode modul saya dihasilkan, dan kemudian setiap kode tambahan yang perlu dihasilkan karena saya telah menggunakannya dalam modul saya. Tujuan akhir saya adalah tidak perlu mengkompilasi seluruh sistem hanya karena saya sedang mengerjakan satu modul.
Alan Storm
3

Anda dapat mengenali dengan

paket> modul> registrasi.php

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

dan kemudian lari

modul php -f bin / magento: aktifkan Package_Module --clear-static-content

pendaftaran.php akan mengenali modul dan kompilasi modul kustom Anda.

Saya harap ini akan membantu Anda.

bantah vachhani
sumber
2
Informasi yang berguna, tetapi bukan yang saya cari. Ini bukan konten statis yang ingin saya kompilasi, ini generasi yang berjalan saat Anda menjalankan setup: di: compile. Itu hal yang berbeda.
Alan Storm
-3

Ketika Anda mengubah konstruktor Anda untuk kelas yang dihasilkan dalam permintaan sebelumnya, itu akan rusak. Jika Anda berada dalam kebutuhan seperti itu cukup hapus var/cache, var/generationdan var/di(jika ada) dan segarkan halaman. Pastikan mode adalah pengembang tempat Anda bekerja.

(Saya tidak mengatakan cara ini magento tidak akan mengkompilasi atau menghasilkan basis kode, ya itu akan. Melakukan cara ini, itu memberikan sedikit bantuan dari menjalankan "setup: di: compile" setiap kali Anda membuat perubahan dalam rute atau kelas Anda)

Laxman Singh
sumber
Ini sepertinya menjawab pertanyaan yang berbeda.
Alan Storm
Jawabannya sudah diberikan oleh Anton Kril di atas, itu sangat lurus dan logis benar. Saya hanya mencoba memberi Anda solusi alternatif yang tidak akan membiarkan Anda menjalankan perintah dan menonton layar Anda sampai kompilasi berjalan. Dengan melakukan ini, Anda dapat menghemat waktu. Jawabannya cukup banyak terkait dengan pertanyaan Anda. Jika ini sikap Anda, maka tidak ada seorang pun yang memberikan solusi dan pikiran.
Laxman Singh