Magento2 - Kurulum: di: derleme


12

Bazı özel kodlarla bir projede çalışıyorum ... bu bizim ilk "orta" Magento 2 projemiz, bu yüzden (buradaki tüm insanların düşündüğü gibi) her gün yeni şeyler öğreniyoruz ve anlaşma yolunu değiştirmeliyiz bu yeni Magento versiyonu ile

Bu sorunun nedeni emri sormaktır setup:di:compile

Bin / magento her şeyden sonra istediği gibi Magento 2 ile ilk günden beri kullanıyorum setup:upgrade, "Lütfen Magento derleme komutunu tekrar çalıştırın."

Şey ... setup:di:compileTamamen belirsiz bir Ölümcül Hata ile bu projede mola ürün görünümü sayfası yürüttüğümü buldum . Ben hata ayıklama ve sıfır sonuç ile kod değişiklikleri ile test tüm iş günü geçirdim

Bugün, bu komutu atlarsam, o zaman üretim modunda bile hepsinin bir cazibe gibi çalıştığını keşfettim.

Yani soru şu ... bu setup:di:compilekomut tam olarak ne işe yarıyor? Gerekli mi? Yeni mi tavsiye ettiniz? Yoksa yürütülmesi gerekmeyen, kullanımdan kaldırılmış bir komut mu?

GÜNCELLEME

Bazı kullanıcıların istediği gibi, bu bahsettiğim Önemli Hata

PHP Önemli hata: Soyut sınıf Magento \ Catalog \ Block \ Product \ View \ AbstractView somutlaştırılamaz *** / vendor / magento / framework / ObjectManager / Factory / AbstractFactory.php on line 93

Magento \ Catalogue \ Block \ Product \ View \ AbstractView kullanarak herhangi bir özel blok aradım, ancak sadece düzen dosyalarında buldum, herhangi bir blok sınıfı yapıcısında mevcut değil

Ne anlayamıyorum: neden Magento derlenmiş kod ile bu önemli hata atıyor, ama derlenmiş kod olmadan bir çekicilik gibi çalışır


'setup: di: compile' öğesinin geliştirme modunda da ürün görüntüleme hatasına neden olduğunu doğrulayabilir misiniz?
paj

evet, Her iki modda da Önemli Hata
Raul Sanchez

"Tamamen belirsiz Ölümcül Hata" gönderebilir misiniz?
paj

Soruyu hatayla güncelledim. Teşekkürler
Raul Sanchez

Yanıtlar:


21

Komut setup:di:compilekomutu var/diMagento <2.2 ve generated Magento> = 2.2 için klasör içeriğini oluşturur

Magento'ya göre, bu aşağıdaki amaca hizmet eder:

  • Uygulama kodu oluşturma (fabrikalar, proxy'ler vb.)
  • Alan konfigürasyonu toplama (yani alan başına optimize edilmiş bağımlılık enjeksiyon konfigürasyonları)
  • Toplayıcı üretimi (yani, yakalayıcıların optimize edilmiş kod üretimi)
  • Önleme önbellek oluşturma
  • Havuz kodu oluşturma (yani API'lar için oluşturulan kod)
  • Hizmet veri öznitelikleri oluşturma (yani veri nesneleri için oluşturulan uzantı sınıfları)

Kaynak ( http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html )

Ancak, Magento'yu üretim moduna getirdiğinizde, derleme olmadan gerçekten de çalışır. Magento belgelerine göre bu daha çok bir optimizasyon adımıdır (yani, yakalayıcıların optimize edilmiş kod üretimi)

Komutta hatalar olduğunda setup:di:compile, bunun nedeni çoğunlukla özel php sınıflarının kurucularından birindeki hatalardır.


1
Teşekkürler! Yani, tamamen isteğe bağlı ... Sadece bir nokta, bu yüzden benim için daha açık. Bizim durumumuzda, setup: di: compile herhangi bir hata atmaz, komut tamamlanır. Siteye göz atarken, komut bittikten sonra, Önemli Hata tetiklendiğinde, ürün görünüm sayfalarında
Raul Sanchez

Belki hatayı gönderebilirsiniz? Bu daha açık bir şey olurdu.
Tjitse

Soruyu hatayla güncelledim. Teşekkürler
Raul Sanchez

12

setup:di:compileKomutu her zaman çalıştırmak zorunlu değildir, ancak fabrika yöntemleri, proxy, eklenti ekleme veya herhangi bir kod derlemesi ile özel olarak herhangi bir kod değişikliği yaptıysanız, bu komutu çalıştırmanız gerekir.

Daha fazla detay

magento setup:di:compilegerekli dosyaları oluşturmak için. Her iki seçenek de MAGENTO_ROOT/var/generation directory(veya /generatedMagento 2.2+ ise) sınıflar üreterek sona erer .

Hangi sınıflar üretilir?

  1. Fabrikalar
  2. Proxy
  3. eklentiler

Fabrikalar

Fabrikalar, otomatik olarak enjekte edilemeyen nesneleri başlatmak için kullanılır. Örneğin, bir ürün nesnesinin veritabanından yüklenmesi gerekir, ancak bağımlılık enjeksiyon kabı bu nesneyi oluşturmak için yeterli bilgiye sahip değildir. Bu yüzden fabrikaları kullanıyoruz.

Proxy

Magento 2, tüm bağımlılıkların gerekli olduğu yapıcı enjeksiyonunu kullanır. Tüm bağımlılıkları geçmeden bir nesneyi başlatamazsınız. İsteğe bağlı bağımlılıklara sahip olmak isterseniz ne olur? Bu yüzden vekiller var.

Eklentiler (Toplayıcılar)

Basitçe söylemek gerekirse, eklentiler Magento 2 için birincil özelleştirme mekanizmalarıdır. Artık sınıf yeniden yazma yok. Uygulamanın herhangi bir genel yönteminden önce, sonra veya etrafında bir şey takmanıza ve yapmanıza olanak tanır.

setup: di: compile komutunu çalıştırdığınızda aşağıdaki şeyleri yapar

Kod derleme belirli bir sırayla aşağıdakilerin tümünü içerir:

  • Uygulama kodu oluşturma (fabrikalar, proxy'ler vb.)

  • Alan konfigürasyonu toplama (yani alan başına optimize edilmiş bağımlılık enjeksiyon konfigürasyonları)

  • Toplayıcı üretimi (yani, yakalayıcıların optimize edilmiş kod üretimi)

  • Önleme önbellek oluşturma Depolar kod üretimi (yani, API'ler için oluşturulan kod)

  • Hizmet veri öznitelikleri oluşturma (yani veri nesneleri için oluşturulan uzantı sınıfları)

Hangi komutları ne zaman çalıştırmamız gerektiğine ilişkin bu cevaba başvurun: https://magento.stackexchange.com/a/184927/35758


Teşekkürler! Yani, tamamen isteğe bağlı ... Sadece bir nokta, bu yüzden benim için daha açık. Bizim durumumuzda, setup: di: compile herhangi bir hata atmaz, komut tamamlanır. Siteye göz atarken, komut bittikten sonra, Önemli Hata tetiklendiğinde, ürün görünümü sayfalarında ... bu yüzden derlenmiş kodun neden işe yaramadığını ama derlerken Önemli Hata meydana geldiğini gerçekten anlamıyorum
Raul Sanchez

Bu, alt sınıfınız üst sınıfın mevcut isteğe bağlı bağımlılıklarından sonra yeni bağımlılıklar eklediyse olabilir. Gerekli olan tüm yeni parametreleri isteğe bağlı parametrelerin üzerine taşıyarak bunu düzeltebilirsiniz.
Prince Patel

2

Magento, di: compile komutu olmadan hala üretimde ve geliştirmede çalışacaktır. Aslında Durdurucuları gerektiği gibi derleyecek ve generatedklasörde saklayacaktır .

Çalışıyor olsa bile, bu adımı atlamanız gerektiği anlamına gelmez! Aslında, bu çalıştırıldığında, magento yinelenen enjeksiyonları, bağımlılık döngülerini ve sitenizi daha kararlı hale getirecek ve çökme ve ölme olasılığını azaltacak diğer temel adımları da denetler.

Bu hatanın, Magento'nun bazı yanlış yapıcı argümanları nedeniyle derleyemediği bir sınıfın kullanılmasından kaynaklandığına inanıyorum.

Gönderdiğiniz hata oldukça belirsiz, ancak sınıfı genişleten bir sınıfınız olduğuna inanıyorum AbstractView,% 99, özel modüllerinizde yönteme doğru bağımsız değişkenleri geçmeyenparent::__construct() bir blok . Böylece, somutlaştırıldığında başarısız olur.

Not o tüm sizinle derleme komutu çalıştırmak gerekecek böylece bloklar AbstractView sınıfını genişletmek xdebugve başarısız önce sınıf son dediği ne olduğunu görmek için yığın izleme bakmak bir günlük ayarlayın.

Site olduğunuzu o hata araçlarının olmadan çalışır gerçeği değil aslında kullanarak bozuk sayfanızda blok hiçbir yerinde, ama çalıştırırken Magento hala derlemek için çalışacağız compilekomutu, dolayısıyla başarısız.


Bu gibi daha eski bir soruyu, onaylanmış diğer cevaplarla cevaplamak için zaman ayırdığınız için teşekkür ederiz ... Aslında, işaret ettiğiniz gibi, özel düzenlerdeki yanlış blokları düzelterek bunu
Raul Sanchez
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.