Magento 2 не позволяет связывать модули с помощью символических ссылок

10

Я добавил локальный модуль разработки (отдельный репозиторий git) в Magento 2, используя символические ссылки, и он работал нормально, пока я не попал в шаблоны PHTML. После тяжелой отладки я обнаружил, что класс файловой системы Magento 2 ( Magento\Framework\Filesystem\Directory\Read) использует isExists()метод в сочетании с getAbsolutePath()вызовом, чтобы проверить, существует ли шаблон PHTML. Тем не менее, getAbsolutePath()метод проверяет, существует ли относительный путь в файловой системе Magento 2, и если нет, он добавляет к корню Magento 2. Это. В моем случае модуль живет в отдельном репо, в /git/Aто время как Magento живет, /site/Bи это поведение проверяет наличие шаблона PHTML в /site/B/git/A.

Вкратце: шаблоны PHTML, которые находятся за пределами корневой файловой системы Magento 2, не выбираются, независимо от того, включен ли параметр конфигурации системы «Разрешить символические ссылки». Кажется, что настройка работает, но только если источник символической ссылки все еще находится в файловой системе Magento 2.

Кто-нибудь еще сталкивался с этим? Каков наилучший способ управления разработкой во внешнем git-репо?

Джисс Рейтсма
источник
50/50 ошибка / функция. Я говорю, подайте проблему .
отметки
@benmarks - это известная проблема, которая имеет обходные пути, см. мой ответ
Алекс Палиаруш

Ответы:

9

Хакерский обходной путь, если вы используете репозиторий пути композитора для вашего модуля.

На registration.phpместе:

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

Это зарегистрирует ваш модуль по символической ссылке в директории корневого вендора Magento вместо его реального пути.

ЖСБ
источник
1
Это решение работало для меня до тех пор, пока я не обновил до Magento 2.3 (я получаю ошибку «Invalid Template File ...»). Есть идеи как это решить?
Пини
Извини, нет. Вы уверены, что это работает, когда вы не используете символическую ссылку? Если это так, вам придется отладить, как M2.3 загружает шаблоны. Может открыть еще один вопрос?
fsw
Работает без символической ссылки.
Пини
Я использую Vagrant во время разработки. Я символическую ссылку /vagrant/app/code/Vendor/на /var/www/shop/app/code/Vendor. Это решило это для меня!
BugHunterUK
Я вернулся. Это решение не работает. Когда я использовал это для символической ссылки моего кода модуля, маршруты adminhtml для моего модуля не работали. Я подтвердил это, удалив символическую ссылку и скопировав файлы в каталог app / code. Плагин тогда работал. Вы можете подтвердить это, создав этот модуль и вставив в него символическую ссылку: devdocs.magento.com/guides/v2.3/ext-best-practices/… ... вы получите ту же проблему, что и у меня.
BugHunterUK
4

Также должна быть возможность манипулировать registration.php, чтобы он указывал на ваш корень разработчика.

Чтобы убедиться, что он загружается, вам нужно выполнить файл registration.php где-нибудь в процессе начальной загрузки.

Самый простой способ (без его установки через composer) - добавить его вручную в vendor / composer / autoload_files.php.

Я также думал о написании модуля для этого. Этот модуль также может быть полезен для интеграционных тестовых сред (для добавления и удаления модулей на лету без необходимости их где-либо копировать).

=== UPDATE ===

К настоящему времени я написал модуль: http://github.com/davidverholen/magento2-dynamic-component-registry

также я думаю, что должно быть возможно связать модули, используя относительные ссылки

Дэвид Верхолен
источник
3

Можно включить / разрешить символические ссылки через магазины => Конфигурация => Дополнительно => Разработчик => Настройки шаблона (как в Magento 1.x):

Вариант конфигурации

(Я не проверял, работает ли этот параметр)

Также вы можете использовать подмодули, таким образом, вам не нужны символические ссылки.

Для разработки я разрабатываю модули в отдельном каталоге и использую PHPStorm, чтобы скопировать их в мою разрабатываемую версию Magento 2.

Владимир Керхофф
источник
1
Спасибо. Параметр, который я упомянул, действительно был параметром «Разрешить символические ссылки» в разделе «Настройки шаблона». Он отлично работает под Magento 1.x, но теперь под Magento 2 файлы должны находиться в корне Magento, а не где-нибудь в файловой системе. Во всяком случае, я буду в порядке - я, вероятно, буду использовать подмодули :)
Jisse Reitsma
Jisse, просто мысль ... вы также можете использовать composer для сборки отдельных модулей при создании артефактов сборки, что позволяет избежать некоторых проблем, с которыми вы можете столкнуться при использовании подмодулей git, хотя это может добавить к сложности вашей сборки обработать. AFAIK, это рекомендованный Magento способ справиться с ситуацией.
Брайан 'BJ' Хоффпауир младший
Спасибо, опции PHPStorm уже решили это для меня, но, как указал @ alex-paliurush, есть некоторые сценарии, когда обходной путь просто не работает. Я добавлю пиар вместо.
Джисс Рейтсма,
Спасибо Брайану за ваше предложение. Тем не менее, composer идеально подходит для работы с производственными сайтами, но я искал лучший способ разработки пользовательских модулей. Composer пока не должен быть в игре, потому что это способ распространения кода, который мне нужно сначала разработать в Magento 2, так что Composer всегда поддерживает различные коммиты. При этом PhpStorm (и другие IDE) уже предлагают решение для этого. Таким образом, единственная проблема, которая остается, состоит в том, что производственные сайты страдают от этого ограничения символической ссылки, а затем ваши аргументы вступают в силу :)
Jisse Reitsma
3

Если вы разрабатываете с использованием PHP Storm, просто скопируйте второй репозиторий в корень проекта Magento. Затем создайте необходимые символические ссылки для включения модуля. PHP Storm будет рассматривать этот проект как многокорневый и распознает оба репозитория. Вы можете выбрать между синхронной и асинхронной (по умолчанию) стратегиями управления хранилищем .

Эта проблема также возникает, когда EE (или любой другой модуль) связан с CE с помощью символических ссылок. Основная причина заключается в том, что registration.phpбазовый путь к модулю вычисляется как реальный путь к каталогу (в вашем случае он находится за пределами проекта Magento). Вот почему относительный путь рассчитывается неправильно, а значит, и абсолютный путь тоже неверен. Если второй репозиторий помещен в корневой каталог Magento, относительный путь будет указывать на реальный путь к файлу (не символическую ссылку), но он все равно будет найден, поэтому все будет работать.

Алекс Палиаруш
источник