Magento 2 non consente il collegamento di moduli mediante collegamenti simbolici


10

Ho aggiunto un modulo di sviluppo locale (repository git separato) a Magento 2 usando collegamenti simbolici e funzionava bene fino a quando non ho colpito i modelli PHTML. Dopo un intenso debug ho scoperto che la classe di filesystem Magento 2 ( Magento\Framework\Filesystem\Directory\Read) utilizza un isExists()metodo combinato con una getAbsolutePath()chiamata per vedere se esiste il modello PHTML. Tuttavia, il getAbsolutePath()metodo controlla se esiste il percorso relativo all'interno del filesystem Magento 2 e, in caso contrario, antepone il root Magento 2 a. esso. Nel mio caso, il modulo vive in un repository separato /git/Amentre Magento vive /site/Be questo comportamento verifica l'esistenza di un modello PHTML in /site/B/git/A.

In breve: i modelli PHTML che vivono al di fuori del filesystem di root di Magento 2 non vengono rilevati, indipendentemente dall'impostazione della configurazione del sistema "Consenti collegamenti simbolici" attivata. Sembra che l'impostazione stia funzionando, ma solo se l'origine del collegamento simbolico è ancora all'interno del filesystem Magento 2.

Qualcun altro ha riscontrato questo? Quale sarebbe il modo migliore per gestire lo sviluppo in un repository git esterno?


Bug / funzione 50/50. Dico di presentare un problema .
benmarks

@benmarks questo è un problema noto che ha una soluzione alternativa, vedi la mia risposta
Alex Paliarush,

Risposte:


9

Soluzione alternativa se si utilizza il repository del percorso del compositore per il modulo.

In registration.phpput:

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

Questo registrerà il tuo modulo in un percorso simbolico nella directory del fornitore principale di Magento anziché nel suo vero percorso.


1
Questa soluzione ha funzionato per me fino a quando non ho eseguito l'aggiornamento a Magento 2.3 (visualizzo l'errore "File modello non valido ..."). Qualche idea su come risolverlo?
Pini,

Scusa no. Sei sicuro che funzioni quando non stai usando symlink? In tal caso dovresti eseguire il debug di come M2.3 sta caricando i modelli. Forse aprire un'altra domanda?
fsw,

Funziona senza il collegamento simbolico.
Pini,

Uso Vagrant durante lo sviluppo. Collegamento simbolico /vagrant/app/code/Vendor/a /var/www/shop/app/code/Vendor. Questo mi ha risolto!
BugHunterUK

Sono tornato. Questa soluzione non funziona. Quando l'ho usato per collegare simbolicamente il mio codice del modulo, i percorsi adminhtml per il mio modulo non funzionavano. L'ho confermato rimuovendo il collegamento simbolico e copiando i file nella directory app / codice. Il plugin ha quindi funzionato. Puoi confermare creando questo modulo e collegandolo simbolicamente : devdocs.magento.com/guides/v2.3/ext-best-practices/… ... otterrai lo stesso problema che ho avuto.
BugHunterUK,

4

Dovrebbe anche essere possibile manipolare registration.php per puntare alla tua radice dev.

Per essere sicuro che venga caricato, dovresti eseguire registration.php da qualche parte nel processo di bootstrap.

Il modo più semplice (senza installarlo tramite il compositore) sarebbe quello di aggiungerlo manualmente al fornitore / compositore / autoload_files.php.

Ho anche pensato di scrivere un modulo per questo. Questo modulo potrebbe anche essere utile per ambienti di test di integrazione (per aggiungere e rimuovere moduli al volo senza doverli copiare da qualche parte).

=== === UPDATE

ormai ho scritto il modulo: http://github.com/davidverholen/magento2-dynamic-component-registry

inoltre penso che dovrebbe essere possibile collegare i moduli utilizzando i relativi collegamenti simbolici


3

È possibile abilitare / consentire i collegamenti simbolici tramite Stores => Configuration => Advanced => Developer => Impostazioni modello (proprio come in Magento 1.x):

Opzione di configurazione

(Non ho testato se questa impostazione funziona)

Inoltre puoi usare i sottomoduli, in questo modo non hai bisogno di collegamenti simbolici.

Per lo sviluppo, sviluppo moduli in una directory separata e utilizzo PHPStorm per copiarli nella mia installazione di sviluppo di Magento 2.


1
Grazie. L'impostazione che ho citato era in effetti l'impostazione "Consenti collegamenti simbolici" in "Impostazioni modello". Funziona bene con Magento 1.x, ma ora con Magento 2, i file devono trovarsi nella radice di Magento, quindi non solo in qualsiasi punto del filesystem. Comunque, starò bene - probabilmente userò i sottomoduli :)
Jisse Reitsma il

Jisse, solo un pensiero ... puoi anche usare il compositore per assemblare moduli separati quando produci i tuoi manufatti di compilazione, il che tende ad evitare alcuni dei problemi che potresti incontrare con i sottomoduli git, sebbene possa aumentare la complessità della tua compilazione processi. AFAIK, questo è il modo consigliato da Magento per gestire la situazione.
Bryan 'BJ' Hoffpauir Jr.,

Grazie, le opzioni di PHPStorm l'hanno già risolto per me, ma come ha sottolineato @ alex-paliurush, ci sono alcuni scenari in cui la soluzione alternativa semplicemente non funziona. Aggiungerò invece un PR.
Jisse Reitsma,

Grazie Bryan anche per il tuo suggerimento. Tuttavia, il compositore è perfetto quando si tratta di siti di produzione, ma stavo cercando un modo migliore per sviluppare moduli personalizzati. Il compositore non dovrebbe essere ancora in gioco, perché è il modo di distribuire il codice che devo sviluppare prima in Magento 2, quindi il compositore è sempre impegnato in vari modi. Detto questo, PhpStorm (e altri IDE) offrono già una soluzione per questo. Quindi l'unico problema che rimane è che i siti di produzione soffrono di questa limitazione del
collegamento

3

Se sviluppi utilizzando PHP Storm, copia il secondo repository nella radice del progetto Magento. Quindi creare i collegamenti simbolici necessari per abilitare il modulo. PHP Storm tratterà questo progetto come multiroot e riconoscerà entrambi i repository. È possibile scegliere tra strategie di gestione del repository sincrone e asincrone (impostazione predefinita) .

Questo problema si verifica anche quando EE (o qualsiasi altro modulo) è collegato a CE tramite symlink. La causa principale è che registration.phpcalcola il percorso del modulo base come percorso reale alla directory (nel tuo caso è al di fuori del progetto Magento). Ecco perché il percorso relativo viene calcolato in modo errato e quindi anche il percorso assoluto non è corretto. Se il secondo repository viene inserito nella radice di Magento, il percorso relativo punta al percorso del file reale (non al collegamento simbolico), ma verrebbe comunque trovato, quindi tutto funzionerà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.