Magento 2 nie pozwala na łączenie modułów za pomocą dowiązań symbolicznych

10

Dodałem lokalny moduł programistyczny (osobne repozytorium git) do Magento 2 za pomocą dowiązań symbolicznych i działał dobrze, dopóki nie trafiłem na szablony PHTML. Po intensywnym debugowaniu dowiedziałem się, że klasa systemu plików Magento 2 ( Magento\Framework\Filesystem\Directory\Read) używa isExists()metody połączonej z getAbsolutePath()wywołaniem, aby sprawdzić, czy istnieje szablon PHTML. Jednak getAbsolutePath()metoda sprawdza, czy ścieżka względna istnieje w systemie plików Magento 2, a jeśli nie, zastępuje katalog główny Magento 2. to. W moim przypadku moduł żyje w osobnym repozytorium, /git/Apodczas gdy Magento żyje, /site/Ba to zachowanie sprawdza obecność szablonu PHTML w /site/B/git/A.

Krótko mówiąc: szablony PHTML, które działają poza głównym systemem plików Magento 2, nie są pobierane, niezależnie od tego, czy włączone jest ustawienie konfiguracji systemu „Zezwalaj na dowiązania symboliczne”. Wygląda na to, że ustawienie działa, ale tylko wtedy, gdy źródło dowiązania symbolicznego nadal znajduje się w systemie plików Magento 2.

Czy ktoś jeszcze tego doświadczył? Jaki byłby najlepszy sposób obsługi rozwoju w zewnętrznym repozytorium git?

Jisse Reitsma
źródło
Błąd 50/50 / funkcja. Mówię, zgłoś problem .
zwraca
@benmarks to znany problem, który ma obejście, zobacz moją odpowiedź
Alex Paliarush,

Odpowiedzi:

9

Hackish obejście, jeśli używasz repozytorium ścieżki kompozytora dla swojego modułu.

W registration.phpzestawie:

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

Spowoduje to zarejestrowanie modułu pod dowiązaniem symbolicznym w katalogu głównego dostawcy Magento zamiast jego rzeczywistej ścieżki.

fsw
źródło
1
To rozwiązanie działało dla mnie do momentu aktualizacji do Magento 2.3 (pojawia się błąd „Nieprawidłowy plik szablonu ...”). Masz pomysł, jak to rozwiązać?
Pini,
Przepraszam, nie. Czy na pewno to działa, gdy nie używasz dowiązania symbolicznego? Jeśli tak, musisz debugować, w jaki sposób M2.3 ładuje szablony. Może otworzyć kolejne pytanie?
fsw
Działa bez dowiązania symbolicznego.
Pini
Używam Vagrant podczas programowania. Mam dowiązanie symboliczne /vagrant/app/code/Vendor/do /var/www/shop/app/code/Vendor. To rozwiązało dla mnie!
BugHunterUK
Wróciłem. To rozwiązanie nie działa. Gdy użyłem tego do symlinkowania mojego kodu modułu, trasy adminhtml dla mojego modułu nie działały. Potwierdziłem to, usuwając dowiązanie symboliczne i kopiując pliki do katalogu app / code. Wtyczka następnie działała. Możesz to potwierdzić, tworząc ten moduł i łącząc go symbolicznie : devdocs.magento.com/guides/v2.3/ext-best-practices/ ... ... dostaniesz ten sam problem, który miałem.
BugHunterUK
4

Powinna istnieć także możliwość manipulowania plikiem register.php, aby wskazać katalog główny użytkownika.

Aby upewnić się, że się ładuje, musisz wykonać plik register.php gdzieś w procesie ładowania.

Najłatwiejszym sposobem (bez instalowania go za pomocą kompozytora) byłoby dodanie go ręcznie do dostawcy / composer / autoload_files.php.

Pomyślałem także o napisaniu modułu do tego. Ten moduł może być również przydatny w środowiskach testowych integracji (do dodawania i usuwania modułów w locie bez konieczności ich gdzieś kopiowania).

=== AKTUALIZACJA ===

do tej pory napisałem moduł: http://github.com/davidverholen/magento2-dynamic-component-registry

także myślę, że powinno być możliwe łączenie modułów za pomocą względnych dowiązań symbolicznych

David Verholen
źródło
3

Możliwe jest włączenie / zezwolenie dowiązań symbolicznych przez Sklepy => Konfiguracja => Zaawansowane => Deweloper => Ustawienia szablonu (tak jak w Magento 1.x):

Opcja konfiguracji

(Nie testowałem, czy to ustawienie działa)

Możesz także używać submodułów, dzięki czemu nie potrzebujesz dowiązań symbolicznych.

W celu programowania tworzę moduły w osobnym katalogu i używam PHPStorm, aby skopiować je do mojej instalacji programistycznej Magento 2.

Vladimir Kerkhoff
źródło
1
Dzięki. Ustawienie, o którym wspomniałem, było rzeczywiście „Zezwalaj na dowiązania symboliczne” w „Ustawieniach szablonu”. Działa ładnie pod Magento 1.x, ale teraz pod Magento 2, pliki muszą znajdować się w katalogu głównym Magento, więc nie tylko w dowolnym miejscu w systemie plików. W każdym razie wszystko będzie dobrze - prawdopodobnie
użyję
Jisse, tylko myśl ... możesz także użyć kompozytora do złożenia osobnych modułów podczas tworzenia artefaktów kompilacji, co pozwala uniknąć niektórych problemów, które możesz napotkać z podmodułami git, choć może to zwiększyć złożoność kompilacji proces. AFAIK, to zalecany przez Magento sposób radzenia sobie z sytuacją.
Bryan „BJ” Hoffpauir Jr.
Dzięki, opcje PHPStorm już dla mnie rozwiązały, ale jak zauważył @ alex-paliurush, istnieją pewne scenariusze, w których obejście to po prostu nie działa. Zamiast tego dodam PR.
Jisse Reitsma
Dziękuję Bryan za twoją sugestię. Kompozytor jest jednak doskonały w kontaktach z zakładami produkcyjnymi, ale szukałem lepszego sposobu na opracowanie niestandardowych modułów. Kompozytor nie powinien być jeszcze w grze, ponieważ jest to sposób na rozprowadzenie kodu, który muszę najpierw opracować w Magento 2, więc kompozytor zawsze jest w tyle za różnymi zobowiązaniami. To powiedziawszy, PhpStorm (i inne IDE) już oferują rozwiązanie tego problemu. Pozostaje więc tylko problem, że zakłady produkcyjne cierpią na to ograniczenie dowiązań symbolicznych, a następnie
pojawiają się
3

Jeśli tworzysz za pomocą PHP Storm, po prostu skopiuj drugie repozytorium do katalogu głównego projektu Magento. Następnie utwórz niezbędne dowiązania symboliczne, aby włączyć moduł. PHP Storm potraktuje ten projekt jako multirootowany i rozpozna oba repozytoria. Możesz wybierać między strategiami zarządzania repozytoriami synchronicznymi i asynchronicznymi (domyślne) .

Ten problem występuje również wtedy, gdy EE (lub dowolny inny moduł) jest połączony z CE za pomocą dowiązań symbolicznych. Główną przyczyną jest to, że registration.phpoblicza ścieżkę modułu podstawowego jako rzeczywistą ścieżkę do katalogu (w twoim przypadku jest to poza projektem Magento). Dlatego ścieżka względna jest obliczana niepoprawnie, a następnie ścieżka bezwzględna jest również niepoprawna. Jeśli drugie repozytorium zostanie umieszczone w katalogu głównym Magento, ścieżka względna wskazywałaby na rzeczywistą ścieżkę do pliku (nie dowiązanie symboliczne), ale nadal byłaby znaleziona, więc wszystko będzie działać.

Alex Paliarush
źródło