Magento 2 ไม่อนุญาตให้เชื่อมโยงโมดูลโดยใช้ symlinks


10

ฉันได้เพิ่มโมดูลการพัฒนาในพื้นที่ (แยก git repo) ลงใน Magento 2 โดยใช้ลิงก์สัญลักษณ์และมันทำงานได้ดีจนกระทั่งฉันกดแม่แบบ PHTML หลังจากการดีบักอย่างหนักฉันพบว่าคลาสระบบไฟล์ Magento 2 Magento\Framework\Filesystem\Directory\Readใช้isExists()วิธีการร่วมกับการgetAbsolutePath()โทรเพื่อดูว่ามีเทมเพลต PHTML อยู่หรือไม่ อย่างไรก็ตามgetAbsolutePath()วิธีการตรวจสอบว่าเส้นทางสัมพัทธ์ที่มีอยู่ภายในระบบไฟล์ Magento 2 และถ้าไม่มันจะเตรียมราก Magento 2 เพื่อ มัน. ในกรณีของฉันโมดูลอาศัยอยู่ใน repo แยกต่างหาก/git/Aขณะที่ Magento ใช้ชีวิต/site/Bและพฤติกรรมนี้ตรวจสอบว่ามีเทมเพลต PHTML อยู่/site/B/git/Aหรือไม่

กล่าวโดยย่อ: เทมเพลต PHTML ที่อยู่นอกระบบไฟล์รูทของ Magento 2 ไม่ได้รับมาโดยไม่คำนึงถึงการตั้งค่าการกำหนดค่าระบบ "Allow Symlinks" ดูเหมือนว่าการตั้งค่าใช้งานได้ แต่ถ้าแหล่งที่มาของ symlink ยังคงอยู่ในระบบไฟล์ Magento 2

มีใครพบกับสิ่งนี้อีกไหม? อะไรจะเป็นวิธีที่ดีที่สุดในการจัดการกับการพัฒนาใน repo คอมไพล์ภายนอก


ข้อผิดพลาด 50/50 / คุณสมบัติ ผมบอกว่ายื่นปัญหา
benmarks

@benmarks ปัญหานี้เป็นที่รู้จักกันซึ่งมี workaroud ให้ดูคำตอบของฉัน
อเล็กซ์ Paliarush

คำตอบ:


9

หลีกเลี่ยงวิธีแก้ปัญหาหากคุณใช้ที่เก็บพา ธ ผู้แต่งสำหรับโมดูลของคุณ

ในการregistration.phpใส่:

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

สิ่งนี้จะลงทะเบียนโมดูลของคุณภายใต้เส้นทาง symlinked ในผู้ขายรูทของวีโอไอพีแทนที่จะเป็นเส้นทางจริง


1
วิธีนี้ใช้ได้ผลสำหรับฉันจนกว่าฉันจะอัปเกรดเป็น Magento 2.3 (ฉันได้รับข้อผิดพลาด 'ไฟล์เทมเพลตไม่ถูกต้อง ... ') ความคิดวิธีการแก้ปัญหาใด ๆ
Pini

ขอโทษค่ะ คุณแน่ใจหรือว่าใช้งานได้เมื่อคุณไม่ได้ใช้ symlink? ถ้าเป็นเช่นนั้นคุณจะต้องดีบักวิธีที่ M2.3 กำลังโหลดเทมเพลต อาจเปิดคำถามอีกครั้ง
fsw

มันใช้งานได้โดยไม่มี symlink
Pini

ฉันใช้ Vagrant ระหว่างการพัฒนา ฉัน symlink ไป/vagrant/app/code/Vendor/ /var/www/shop/app/code/Vendorวิธีนี้แก้ไขได้สำหรับฉัน!
BugHunterUK

ฉันกลับมาแล้ว. วิธีนี้ไม่ทำงาน เมื่อฉันใช้สิ่งนี้เพื่อเชื่อมโยงโค้ดโมดูลของฉันเส้นทาง adminhtml สำหรับโมดูลของฉันจะไม่ทำงาน ฉันยืนยันสิ่งนี้ด้วยการลบ symlink และคัดลอกไฟล์ไปยังไดเรกทอรีแอป / รหัส ปลั๊กอินทำงานแล้ว คุณสามารถยืนยันได้โดยการสร้างโมดูลนี้และเชื่อมโยง : devdocs.magento.com/guides/v2.3/ext-best-practices/ ...... คุณจะได้รับปัญหาเดียวกันกับที่ฉันมี
BugHunterUK

4

มันควรจะเป็นไปได้ที่จะจัดการกับ register.php เพื่อชี้ไปที่รูท dev ของคุณ

เพื่อให้แน่ใจว่ากำลังโหลดคุณจะต้องเรียกใช้ register.php ในกระบวนการบูทสแตรปของคุณ

วิธีที่ง่ายที่สุด (โดยไม่ต้องติดตั้งผ่านผู้แต่ง) จะเป็นการเพิ่มด้วยตนเองไปยังผู้ขาย / ผู้แต่ง / autoload_files.php

ฉันยังคิดเกี่ยวกับการเขียนโมดูลสำหรับสิ่งนี้ โมดูลนี้อาจมีประโยชน์สำหรับสภาพแวดล้อมการทดสอบการรวม (สำหรับการเพิ่มและลบโมดูลได้ทันทีโดยไม่ต้องคัดลอกบางส่วน)

=== UPDATE ===

โดยตอนนี้ฉันเขียนโมดูล: http://github.com/davidverholen/magento2-dynamic-component-registry

ฉันยังคิดว่ามันควรจะเป็นไปได้ที่จะเชื่อมโยงโมดูลโดยใช้ symlinks


3

เป็นไปได้ที่จะเปิดใช้งาน / อนุญาต symlink ผ่าน Stores => Configuration => Advanced => Developer => การตั้งค่าเทมเพลต (เช่นเดียวกับ Magento 1.x):

ตัวเลือกการกำหนดค่า

(ฉันไม่ได้ทดสอบว่าการตั้งค่านี้ใช้งานได้)

นอกจากนี้คุณยังสามารถใช้ submodules ด้วยวิธีนี้คุณไม่จำเป็นต้องมี symlink

สำหรับการพัฒนาฉันพัฒนาโมดูลในไดเร็กตอรี่แยกต่างหากและใช้ PHPStorm เพื่อคัดลอกไปยังการพัฒนาของการติดตั้ง Magento 2


1
ขอบคุณ การตั้งค่าที่ฉันกล่าวถึงนั้นเป็นการตั้งค่า "Allow Symlinks" ภายใต้ "การตั้งค่าเทมเพลต" มันทำงานได้ดีภายใต้ Magento 1.x แต่ตอนนี้ภายใต้ Magento 2 ไฟล์จะต้องอยู่ในรูท Magento ดังนั้นจึงไม่ใช่เฉพาะในระบบไฟล์ อย่างไรก็ตามผมจะปรับ - ฉันอาจจะใช้ submodules :)
Jisse Reitsma

Jisse เป็นเพียงความคิด ... คุณยังสามารถใช้นักแต่งเพลงเพื่อรวบรวมโมดูลแยกต่างหากเมื่อคุณสร้างสิ่งประดิษฐ์ที่สร้างขึ้นซึ่งมีแนวโน้มที่จะหลีกเลี่ยงปัญหาบางอย่างที่คุณอาจพบกับ submodules คอมไพล์แม้ว่ามันอาจเพิ่มความซับซ้อนของงานสร้างของคุณ กระบวนการ. AFAIK นี่เป็นวิธีที่วีโอไอพีแนะนำเพื่อจัดการกับสถานการณ์
ไบรอัน 'BJ' Hoffpauir Jr.

ขอบคุณตัวเลือก PHPStorm แก้ไขแล้วสำหรับฉัน แต่เมื่อ @ alex-paliurush ชี้ให้เห็นมีบางสถานการณ์ที่วิธีแก้ปัญหาใช้งานไม่ได้ ฉันจะเพิ่มการประชาสัมพันธ์แทน
Jisse Reitsma

ขอบคุณไบรอันสำหรับคำแนะนำของคุณเช่นกัน อย่างไรก็ตามผู้แต่งนั้นสมบูรณ์แบบเมื่อต้องรับมือกับไซต์การผลิต แต่ฉันกำลังมองหาวิธีที่ดีกว่าในการพัฒนาโมดูลที่กำหนดเอง นักแต่งเพลงยังไม่ควรเล่นเพราะเป็นวิธีการแจกจ่ายรหัสที่ฉันต้องพัฒนาใน Magento 2 ก่อนดังนั้นนักแต่งเพลงจึงมักจะผูกมัดอยู่เบื้องหลัง ที่ถูกกล่าวว่า PhpStorm (และ IDE อื่น ๆ ) เสนอทางออกสำหรับเรื่องนี้แล้ว ดังนั้นปัญหาเดียวที่ยังคงเป็นสถานที่ผลิตที่ทุกข์ทรมานจากข้อ จำกัด symlink นี้แล้วข้อโต้แย้งของคุณเตะใน :)
Jisse Reitsma

3

หากคุณพัฒนาโดยใช้ PHP Storm เพียงคัดลอกที่เก็บข้อมูลที่สองไปยังรูทโปรเจค Magento จากนั้นสร้าง symlink ที่จำเป็นเพื่อเปิดใช้งานโมดูล PHP Storm จะถือว่าโปรเจ็กต์นี้เป็นแบบหลายรูทและจะรับรู้ที่เก็บทั้งสอง คุณอาจจะเลือกระหว่าง (เริ่มต้น) ซิงโครและไม่ตรงกันกลยุทธ์การจัดการพื้นที่เก็บข้อมูล

ปัญหานี้เกิดขึ้นเมื่อ EE (หรือโมดูลอื่น ๆ ) เชื่อมโยงกับ CE โดยใช้ symlinks สาเหตุที่แท้จริงคือการregistration.phpคำนวณเส้นทางโมดูลฐานเป็นเส้นทางจริงไปยังไดเรกทอรี (ในกรณีของคุณมันอยู่นอกโครงการวีโอไอพี) นั่นคือเหตุผลที่คำนวณเส้นทางสัมพัทธ์ไม่ถูกต้องและเส้นทางสัมบูรณ์นั้นไม่ถูกต้องเช่นกัน หากที่เก็บที่สองอยู่ภายใต้รูทของวีโอไอพีพา ธ ที่สัมพันธ์กันจะชี้ไปที่พา ธ ไฟล์จริง (ไม่ใช่ symlink) แต่จะยังคงพบอยู่ดังนั้นทุกอย่างจะทำงานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.