Magento 2: Run `setup: di: compile` ** sadece ** belirli bir modül?


33

Belirli bir modül için önceden kod üretmek mümkün mü? IE - Sistemdeki tüm kodu üretebilirim.

php bin/magento setup:di:compile

Ancak, bu uzun zaman alabilir. Sadece belirli bir modül için dosyaları önceden oluşturmak istiyorum .

php bin/magento setup:di:compile Pulsestorm_Commercebug

Çözmeye çalıştığım belirli sorun , geliştirici / varsayılan modda tanınmayan bazı eklentilerle bu soruna geçici bir çözüm bulmaktır.


En son "Açık Sorular" makalenizi okuduktan sonra cevabım güncellendi. Soruya doğrudan cevap: hayır. Çözülmesi karmaşık değil. Sadece uygulanmadı çünkü hiçbir zaman ihtiyaç duyulmadı.
Anton Kril

Bir modülde 'derleme' yeteneği elde etmek harika olurdu, modül geliştirmede hata ayıklama yaparken çok zaman kazandıracak.
Karen Baker,

Yanıtlar:


20

Kısa Cevap: Hayır. Şimdi Magento ile birlikte gönderilen aletler ile mümkün değildir.

Açıklama: Kod üretmeyi ve derlemeyi . Derleyici her ikisini de yapar. Her iki işlem için de diğer tüm magento modüllerinin konfigürasyonunu okumamız gerekir, aksi halde çıktıları yanlış veya dolu olmaz.

DerlemeBir modül için anlamsızdır, çünkü magento sadece bir modül için derlenmiş konfigürasyon ile çalışmayacaktır.

Nesil bir modül için mantıklı olabilir, ama biz yine de tüm diğer yüklü modüllerden yapılandırma ve yapıcı imzaları okumak zorunda kalacaktır. Bu olmadan tüm kodlar üretilemez. Dolayısıyla böyle bir işlem tam derlemeden daha hızlı olmaz. Bunu düşünebiliriz, ancak başvuruda bulunduğunuz hatanın komut uygulanmadan önce düzeltileceğini düşünüyorum.


1
Geliştirme sırasında bir yere yeni bir bağımlılık enjeksiyon argümanı eklendiğinde her zaman yeniden derlemek zorunda kalmak çok acı verici bir durum; geliştirme sırasında kod oluşturmayı tamamen atlamanın bir yolu var mı?
snez

6
Geliştirme sırasında hiçbir zaman derleyici çalıştırmanız gerekmez. Yöntem imzalarını değiştirirseniz dizini temizlemeniz gerekir ancak derleme gerekmez. Derleme yalnızca üretime geçmek içindir.
Anton Kril

12

Magento'nun bin/magentoçalıştırılabilir özelliği sadece bir Symfony Console bileşenidir. Bu, tek bir komut için ayrı ayrı dosyayı bulabileceğiniz anlamına gelir. Adlandırma her zaman kurulum için aynıdır: di: compile DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php) öğesini bulabilirsiniz .

Her zaman exeucte()yöntemi çalıştırır, bu yüzden bakmamız gereken yer orasıdır. Bu işlevde, yöntem $operationstarafından doldurulan bir var ayarlanmış olduğunu göreceksiniz getOperationsConfiguration(). Bu yöntem temel olarak DiCompileCommand öğesinde ne derleneceğini bildirir.

Denedim ilk şey sadece uygulama kodu üreteci kısmını geri döndürmek;

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

Bu oldukça iyi gitti, derleme zamanı önemli ölçüde kesildi;

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

Aksine;

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

Elbette, bu beklenen bir şeyleri kestiğimizden beri bekleniyordu. Ama belirtmedi hangi dosyaları oluşturmak istediğinizi . Örneğin, Interception sınıfları birden fazla modüle bağlı olabileceğinden ve bunu yalnızca bir modül için çalıştırırsanız, size sınırlı bir işlevsellik çıktısı vereceğinden, her dosya modül başına oluşturulamaz.

Sorumlu jeneratörleri burada bulabilirsiniz;

setup / src / Magento / Kurulum / Modül / Di / Uygulama / Görev / Operasyon /

Her sınıfın içinde bir foreach vardır; bu, belirli modülleri / yolları atlamaya devam eden bir if / else eklemenizi sağlar. Belki Symfony Konsol Bileşen Girdi Argümanları belgelerini komuta argümanların nasıl besleneceğine dair kontrol etmek yararlı olacaktır .


Faydalı bilgiler için +1, ancak yeniden: "Ancak, hangi dosyaları oluşturmak istediğinizi belirtmediniz". Bu teknik olarak doğru, ancak sorudaki örtülü modülümün modunu oluşturma arzusu ve sonra benim modülümde kullandığım için üretilmesi gereken herhangi bir ek kod. Son hedefim, sadece bir modül üzerinde çalıştığım için tüm sistemi derlemeye ihtiyaç duymak değil.
Alan Storm,

3

tarafından tanıyabilirsin

paket> modül> registration.php

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

ve koşmaktan

php -f bin / magento modülü: etkinleştirmek - temiz - statik içerik Paket_Modülü

Registration.php modülü tanıyacak ve özel modülünüzü tamamlayacaktır.

Umarım bu sana yardımcı olmuştur.


2
Yararlı bilgiler, fakat aradığım şey değildi. Derlemek istediğim statik içerik değil, setup: di: compile komutunu çalıştırdığınızda çalışan nesil. Bu farklı bir şey.
Alan Storm

-3

Yapıcınızı önceki istekte oluşturulan sınıf için değiştirdiğinizde, kırılır. Böyle ihtiyaçları varsa basitçe silin var/cache, var/generationvevar/di varsa (varsa) ve sayfayı yenileyin. Çalışmakta olduğunuz modun geliştirici olduğundan emin olun.

(Bu şekilde magento derleme yapmayacak veya kod temeli oluşturmayacak demiyorum, evet olacak. Bu şekilde, rotalarınızda veya sınıflarınızda her değişiklik yaptığınızda "setup: di: compile" komutunu çalıştırmanız biraz rahatlama sağlar)


Bu farklı bir soruya cevap veriyor gibi görünüyor.
Alan Storm,

Cevap yukarıda zaten Anton Kril tarafından verildi, bu çok düz ve mantıklı bir şekilde doğru. Sadece size komut çalıştırmanıza ve derleme çalışana kadar ekranınızı izlemenize izin vermeyecek alternatif bir çözüm vermeye çalıştım. Bu şekilde yaparak zaman kazanabilirsiniz. Cevap, sorunuzla yakından ilgilidir. Eğer tavrınız buysa, hiç kimse çözümler ve düşünceler ile gelmedi.
Laxman Singh,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.