Magento 2 tidak memungkinkan menghubungkan Modul menggunakan symlink

10

Saya telah menambahkan modul pengembangan lokal (git repo terpisah) ke Magento 2 menggunakan tautan simbolis dan itu berfungsi dengan baik sampai saya menekan templat PHTML. Setelah debugging berat saya menemukan bahwa kelas sistem file Magento 2 ( Magento\Framework\Filesystem\Directory\Read) menggunakan isExists()metode yang dikombinasikan dengan getAbsolutePath()panggilan untuk melihat apakah template PHTML ada. Namun, getAbsolutePath()metode ini memeriksa apakah path relatif ada di dalam sistem file Magento 2 dan jika tidak, ia akan melanjutkan root Magento 2. Itu. Dalam kasus saya, modul tinggal di repo terpisah /git/Asementara Magento tinggal /site/Bdan perilaku ini memeriksa keberadaan templat PHTML di /site/B/git/A.

Singkatnya: Templat PHTML yang hidup di luar sistem file root Magento 2 tidak diambil, terlepas dari pengaturan Konfigurasi Sistem "Izinkan Symlinks" dihidupkan. Tampaknya pengaturan berfungsi, tetapi hanya jika sumber symlink masih dalam sistem file Magento 2.

Adakah orang lain yang mengalami ini? Apa yang akan menjadi cara terbaik untuk menangani pengembangan dalam repo git eksternal?

Jisse Reitsma
sumber
50/50 bug / fitur. Saya katakan mengajukan masalah .
patokan
@benmark ini adalah masalah yang diketahui yang memiliki workaroud, lihat jawaban saya
Alex Paliarush

Jawaban:

9

Meretas solusi jika Anda menggunakan repositori jalur komposer untuk modul Anda.

Di tempat registration.php:

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Module_Name',
    isset($file) ? dirname($file) : __DIR__
);

Ini akan mendaftarkan modul Anda di bawah jalur yang disinkronkan di dir vendor root Magento alih-alih jalur aslinya.

fsw
sumber
1
Solusi ini berfungsi untuk saya hingga saya ditingkatkan ke Magento 2.3 (saya mendapatkan kesalahan 'File Template Tidak Valid ...'). Adakah cara mengatasinya?
Pini
Maaf tidak. Apakah Anda yakin ini berfungsi ketika Anda tidak menggunakan symlink? Jika demikian, Anda harus men-debug bagaimana M2.3 memuat template. Mungkin membuka pertanyaan lain?
fsw
Ini bekerja tanpa symlink.
Pini
Saya menggunakan Vagrant selama perkembangan. Saya terhubung /vagrant/app/code/Vendor/dengan /var/www/shop/app/code/Vendor. Ini menyelesaikannya untuk saya!
BugHunterUK
Saya kembali. Solusi ini tidak berfungsi. Ketika saya menggunakan ini untuk menghubungkan kode modul saya, rute adminhtml untuk modul saya tidak akan berfungsi. Saya mengkonfirmasi ini dengan menghapus symlink dan menyalin file ke direktori app / code. Pengaya kemudian bekerja. Anda dapat mengonfirmasi dengan membuat modul ini dan menghubungkannya : devdocs.magento.com/guides/v2.3/ext-best-practices/ ... ... Anda akan mendapatkan masalah yang sama dengan yang saya miliki.
BugHunterUK
4

Seharusnya dimungkinkan untuk memanipulasi registrasi.php agar mengarah ke root dev Anda.

Untuk memastikan itu dimuat, Anda harus menjalankan registrasi.php di suatu tempat dalam proses bootstrap Anda.

Cara termudah (tanpa menginstalnya melalui komposer) adalah dengan menambahkannya secara manual ke vendor / komposer / autoload_files.php.

Saya juga berpikir tentang menulis modul untuk ini. Modul ini juga dapat Berguna untuk lingkungan uji integrasi (untuk menambah dan menghapus modul dengan cepat tanpa harus menyalinnya di suatu tempat).

=== UPDATE ===

sekarang saya menulis modul: http://github.com/davidverholen/magento2-dynamic-component-registry

juga saya pikir itu mungkin untuk menghubungkan modul menggunakan symlink relatif

David Verholen
sumber
3

Dimungkinkan untuk mengaktifkan / memperbolehkan symlink melalui Store => Configuration => Advanced => Developer => Pengaturan Template (seperti di Magento 1.x):

Opsi konfigurasi

(Saya tidak menguji apakah pengaturan ini berfungsi)

Anda juga dapat menggunakan submodul, dengan cara ini Anda tidak perlu symlink.

Untuk pengembangan, saya mengembangkan modul dalam direktori terpisah dan menggunakan PHPStorm untuk menyalinnya ke dalam pengembangan instalasi Magento 2.

Vladimir Kerkhoff
sumber
1
Terima kasih. Pengaturan yang saya sebutkan memang pengaturan "Izinkan Symlinks" di bawah "Pengaturan Template". Ini berfungsi dengan baik di bawah Magento 1.x, tetapi sekarang di bawah Magento 2, file harus berada dalam root Magento, jadi bukan sembarang tempat di sistem file. Ngomong-ngomong, aku akan baik-baik saja - aku mungkin akan menggunakan submodul :)
Jisse Reitsma
Jisse, hanya sebuah pemikiran ... Anda juga dapat menggunakan komposer untuk merakit modul terpisah ketika Anda menghasilkan artefak build Anda, yang cenderung menghindari beberapa masalah yang mungkin Anda hadapi dengan git submodules, meskipun mungkin menambah kompleksitas build Anda. proses. AFAIK, ini adalah cara yang disarankan Magento untuk menangani situasi.
Bryan 'BJ' Hoffpauir Jr.
Terima kasih, opsi PHPStorm sudah menyelesaikannya untuk saya, tetapi seperti yang ditunjukkan oleh @ alex-paliurush, ada beberapa skenario di mana solusinya tidak berfungsi. Saya akan menambahkan PR sebagai gantinya.
Jisse Reitsma
Terima kasih Bryan atas saran Anda juga. Namun, komposer sangat cocok ketika berhadapan dengan lokasi produksi, tetapi saya mencari cara yang lebih baik untuk mengembangkan modul khusus. Composer belum boleh dimainkan, karena ini adalah cara untuk mendistribusikan kode yang perlu saya kembangkan dalam Magento 2 terlebih dahulu, jadi komposer selalu memiliki berbagai komitmen di belakang. Yang sedang berkata, PhpStorm (dan IDE lainnya) sudah menawarkan solusi untuk ini. Jadi satu-satunya masalah yang tersisa adalah bahwa situs produksi menderita dari pembatasan symlink ini, dan kemudian argumen Anda masuk :)
Jisse Reitsma
3

Jika Anda mengembangkan menggunakan PHP Storm, cukup salin repositori kedua ke root proyek Magento. Kemudian buat symlink yang diperlukan untuk mengaktifkan modul. PHP Storm akan memperlakukan proyek ini sebagai multiroot dan akan mengenali kedua repositori. Anda dapat memilih antara strategi manajemen repositori sinkron dan asinkron (default) .

Masalah ini juga terjadi ketika EE (atau modul lainnya) ditautkan ke CE menggunakan symlink. Akar penyebabnya adalah yang registration.phpmenghitung jalur modul dasar sebagai jalur nyata ke direktori (dalam kasus Anda ini berada di luar proyek Magento). Itulah sebabnya jalur relatif dihitung secara salah, dan kemudian jalur absolut juga salah. Jika repositori kedua diletakkan di bawah root Magento, path relatif akan menunjuk ke path file nyata (bukan symlink), tetapi masih akan ditemukan, jadi semuanya akan berfungsi.

Alex Paliarush
sumber