Magento 2 erlaubt keine Verknüpfung von Modulen mit Symlinks

10

Ich habe Magento 2 mithilfe symbolischer Links ein lokales Entwicklungsmodul (separates Git-Repo) hinzugefügt, und es hat einwandfrei funktioniert, bis ich auf die PHTML-Vorlagen gestoßen bin. Nach langem Debuggen stellte ich fest, dass die Magento 2-Dateisystemklasse ( Magento\Framework\Filesystem\Directory\Read) eine isExists()Methode verwendet, die mit einem getAbsolutePath()Aufruf kombiniert wird , um festzustellen, ob die PHTML-Vorlage vorhanden ist. Die getAbsolutePath()Methode prüft jedoch, ob der relative Pfad im Magento 2-Dateisystem vorhanden ist. Andernfalls wird das Magento 2-Stammverzeichnis vorangestellt. es. In meinem Fall befindet sich das Modul in einem separaten Repo, /git/Awährend Magento darin lebt, /site/Bund dieses Verhalten überprüft, ob eine PHTML-Vorlage in vorhanden ist /site/B/git/A.

Kurz gesagt: PHTML-Vorlagen, die sich außerhalb des Magento 2-Root-Dateisystems befinden, werden unabhängig von der aktivierten Systemkonfigurationseinstellung "Symlinks zulassen" nicht erfasst. Es scheint, dass die Einstellung funktioniert, aber nur, wenn sich die Quelle des Symlinks noch im Magento 2-Dateisystem befindet.

Hat das noch jemand erlebt? Was wäre der beste Weg, um die Entwicklung in einem externen Git-Repo zu handhaben?

Jisse Reitsma
quelle
50/50 Fehler / Funktion. Ich sage Datei ein Problem .
Benmarks
@benmarks Dies ist ein bekanntes Problem, das eine Workaroud hat, siehe meine Antwort
Alex Paliarush

Antworten:

9

Hackische Problemumgehung, wenn Sie das Composer Path Repository für Ihr Modul verwenden.

In registration.phpput:

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

Dadurch wird Ihr Modul unter dem verknüpften Pfad im Magento-Stammanbieterverzeichnis anstelle des tatsächlichen Pfads registriert.

fsw
quelle
1
Diese Lösung funktionierte für mich, bis ich auf Magento 2.3 aktualisiert habe (ich erhalte den Fehler "Ungültige Vorlagendatei ..."). Irgendeine Idee, wie man es löst?
Pini
Entschuldige Nein. Sind Sie sicher, dass dies funktioniert, wenn Sie Symlink nicht verwenden? In diesem Fall müssten Sie debuggen, wie M2.3 Vorlagen lädt. Vielleicht noch eine Frage öffnen?
fsw
Es funktioniert ohne den Symlink.
Pini
Ich benutze Vagrant während der Entwicklung. Ich sympathisiere /vagrant/app/code/Vendor/mit /var/www/shop/app/code/Vendor. Das hat es für mich gelöst!
BugHunterUK
Ich bin zurück. Diese Lösung funktioniert nicht. Wenn ich dies zum Symlinken meines Modulcodes verwendete, funktionierten die Adminhtml-Routen für mein Modul nicht. Ich habe dies bestätigt, indem ich den Symlink entfernt und die Dateien in das App / Code-Verzeichnis kopiert habe. Das Plugin hat dann funktioniert. Sie können dies bestätigen, indem Sie dieses Modul erstellen und mit einem Link verknüpfen: devdocs.magento.com/guides/v2.3/ext-best-practices/… ... Sie erhalten das gleiche Problem wie ich.
BugHunterUK
4

Es sollte auch möglich sein, die Datei register.php so zu manipulieren, dass sie auf Ihr Dev-Root verweist.

Um sicherzustellen, dass es geladen wird, müssten Sie die Datei register.php irgendwo in Ihrem Bootstrap-Prozess ausführen.

Der einfachste Weg (ohne es über Composer zu installieren) wäre, es manuell zur Datei vendor / composer / autoload_files.php hinzuzufügen.

Ich habe auch darüber nachgedacht, ein Modul dafür zu schreiben. Dieses Modul kann auch für Integrationstestumgebungen nützlich sein (zum Hinzufügen und Entfernen von Modulen im laufenden Betrieb, ohne sie irgendwo kopieren zu müssen).

=== UPDATE ===

Inzwischen habe ich das Modul geschrieben: http://github.com/davidverholen/magento2-dynamic-component-registry

Ich denke auch, dass es möglich sein sollte, Module mit relativen Symlinks zu verknüpfen

David Verholen
quelle
3

Es ist möglich, Symlinks über die Stores zu aktivieren / zulassen => Konfiguration => Erweitert => Entwickler => Vorlageneinstellungen (genau wie in Magento 1.x):

Konfigurationsoption

(Ich habe nicht getestet, ob diese Einstellung funktioniert)

Sie können auch Submodule verwenden, so dass Sie keine Symlinks benötigen.

Für die Entwicklung entwickle ich Module in einem separaten Verzeichnis und kopiere sie mit PHPStorm in meine Entwicklungsinstallation von Magento 2.

Vladimir Kerkhoff
quelle
1
Vielen Dank. Die Einstellung, die ich erwähnte, war in der Tat die Einstellung "Symlinks zulassen" unter "Vorlageneinstellungen". Es funktioniert gut unter Magento 1.x, aber jetzt unter Magento 2 müssen sich die Dateien im Magento-Stammverzeichnis befinden, also nicht irgendwo im Dateisystem. Wie auch immer, mir geht es gut - ich werde wahrscheinlich Submodule verwenden :)
Jisse Reitsma
Jisse, nur ein Gedanke ... Sie können Composer auch verwenden, um separate Module zusammenzustellen, wenn Sie Ihre Build-Artefakte erstellen. Dadurch werden einige Probleme vermieden, die bei Git-Submodulen auftreten können, obwohl dies die Komplexität Ihres Builds erhöhen kann Prozess. AFAIK, dies ist Magentos empfohlene Methode, um mit der Situation umzugehen.
Bryan 'BJ' Hoffpauir Jr.
Vielen Dank, die PHPStorm-Optionen haben es bereits für mich gelöst, aber wie @ alex-paliurush betonte, gibt es einige Szenarien, in denen die Problemumgehung einfach nicht funktioniert. Ich werde stattdessen eine PR hinzufügen.
Jisse Reitsma
Danke Bryan auch für deinen Vorschlag. Der Komponist ist zwar perfekt für den Umgang mit Produktionsstätten, aber ich suchte nach einer besseren Möglichkeit, benutzerdefinierte Module zu entwickeln. Der Komponist sollte noch nicht im Spiel sein, da dies die Möglichkeit ist, den Code zu verteilen, den ich zuerst in Magento 2 entwickeln muss, sodass der Komponist immer verschiedene Commits hinter sich hat. Allerdings bieten PhpStorm (und andere IDEs) bereits eine Lösung dafür. Das einzige Problem, das noch besteht, ist, dass Produktionsstätten unter dieser Symlink-Einschränkung leiden und dann Ihre Argumente auftauchen :)
Jisse Reitsma
3

Wenn Sie mit PHP Storm entwickeln, kopieren Sie einfach das zweite Repository in das Magento-Projektstammverzeichnis. Erstellen Sie dann die erforderlichen Symlinks, um das Modul zu aktivieren. PHP Storm behandelt dieses Projekt als mehrwurzelig und erkennt beide Repositorys. Sie können zwischen synchronen und asynchronen (Standard-) Repository-Verwaltungsstrategien wählen .

Dieses Problem tritt auch auf, wenn EE (oder ein anderes Modul) über Symlinks mit CE verbunden ist. Die Hauptursache ist, dass der registration.phpBasismodulpfad als realer Pfad zum Verzeichnis berechnet wird (in Ihrem Fall außerhalb des Magento-Projekts). Aus diesem Grund wird der relative Pfad falsch berechnet, und dann ist auch der absolute Pfad falsch. Wenn das zweite Repository unter Magento root gestellt wird, verweist der relative Pfad auf den tatsächlichen Dateipfad (nicht auf den Symlink), wird jedoch weiterhin gefunden, sodass alles funktioniert.

Alex Paliarush
quelle