Magento 2 no permite vincular módulos mediante enlaces simbólicos

10

Agregué un módulo de desarrollo local (repositorio git separado) a Magento 2 usando enlaces simbólicos y funcionó bien hasta que llegué a las plantillas PHTML. Después de una fuerte depuración descubrí que la clase de sistema de archivos Magento 2 ( Magento\Framework\Filesystem\Directory\Read) usa un isExists()método combinado con una getAbsolutePath()llamada para ver si existe la plantilla PHTML. Sin embargo, el getAbsolutePath()método verifica si la ruta relativa existe dentro del sistema de archivos Magento 2 y si no, antepone la raíz de Magento 2. eso. En mi caso, el módulo vive en un repositorio separado /git/Amientras Magento vive /site/By este comportamiento verifica la existencia de una plantilla PHTML en /site/B/git/A.

En resumen: las plantillas PHTML que viven fuera del sistema de archivos raíz de Magento 2 no se seleccionan, independientemente de que la configuración del sistema "Permitir enlaces simbólicos" esté activada. Parece que la configuración está funcionando, pero solo si la fuente del enlace simbólico todavía está dentro del sistema de archivos Magento 2.

¿Alguien más ha encontrado esto? ¿Cuál sería la mejor manera de manejar el desarrollo en un repositorio de git externo?

Jisse Reitsma
fuente
50/50 error / función. Yo digo presentar un problema .
puntos de referencia
@benmarks este es un problema conocido que tiene un workaroud, vea mi respuesta
Alex Paliarush

Respuestas:

9

Solución alternativa si está utilizando el repositorio de ruta del compositor para su módulo.

En registration.phpponer:

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

Esto registrará su módulo bajo ruta simbólica en el directorio de proveedores raíz de Magento en lugar de su ruta real.

fsw
fuente
1
Esta solución funcionó para mí hasta que actualicé a Magento 2.3 (aparece el error 'Archivo de plantilla no válido ...'). ¿Alguna idea de cómo solucionarlo?
Pini
Lo siento, no. ¿Estás seguro de que esto funciona cuando no estás usando el enlace simbólico? Si es así, tendría que depurar cómo M2.3 está cargando plantillas. ¿Quizás abrir otra pregunta?
fsw
Está funcionando sin el enlace simbólico.
Pini
Yo uso Vagrant durante el desarrollo. Enlace simbólico /vagrant/app/code/Vendor/a /var/www/shop/app/code/Vendor. ¡Esto lo resolvió para mí!
BugHunterUK
Volví. Esta solución no funciona. Cuando usé esto para vincular mi código de módulo, las rutas adminhtml para mi módulo no funcionaron. Confirmé esto eliminando el enlace simbólico y copiando los archivos al directorio de la aplicación / código. El complemento funcionó. Puede confirmar creando este módulo y vinculándolo simbólicamente: devdocs.magento.com/guides/v2.3/ext-best-practices/… ... obtendrá el mismo problema que tuve.
BugHunterUK
4

También debería ser posible manipular el registro.php para apuntar a su raíz de desarrollo.

Para asegurarte de que se esté cargando, deberías ejecutar el registro.php en algún lugar de tu proceso de arranque.

La forma más fácil (sin instalarlo a través de Composer) sería agregarlo manualmente a vendor / composer / autoload_files.php.

También pensé en escribir un módulo para esto. Este módulo también podría ser útil para entornos de prueba de integración (para agregar y eliminar módulos sobre la marcha sin tener que copiarlos en algún lugar).

=== ACTUALIZACIÓN ===

ahora escribí el módulo: http://github.com/davidverholen/magento2-dynamic-component-registry

También creo que debería ser posible vincular módulos utilizando enlaces simbólicos relativos

David Verholen
fuente
3

Es posible habilitar / permitir enlaces simbólicos a través de Tiendas => Configuración => Avanzado => Desarrollador => Configuración de plantilla (al igual que en Magento 1.x):

Opción de configuración

(No probé si esta configuración funciona)

También puede usar submódulos, de esta manera no necesita enlaces simbólicos.

Para el desarrollo, desarrollo módulos en un directorio separado y uso PHPStorm para copiarlos en mi instalación de desarrollo de Magento 2.

Vladimir Kerkhoff
fuente
1
Gracias. La configuración que mencioné fue la configuración "Permitir enlaces simbólicos" en "Configuración de plantilla". Funciona bien en Magento 1.x, pero ahora en Magento 2, los archivos deben estar dentro de la raíz de Magento, por lo que no en cualquier parte del sistema de archivos. De todos modos, estaré bien, probablemente
usaré
Jisse, solo un pensamiento ... también puede usar el compositor para ensamblar módulos separados cuando produce sus artefactos de construcción, lo que tiende a evitar algunos de los problemas que puede encontrar con los submódulos git, aunque puede aumentar la complejidad de su construcción proceso. AFAIK, esta es la forma recomendada de Magento para manejar la situación.
Bryan 'BJ' Hoffpauir Jr.
Gracias, las opciones de PHPStorm ya lo resolvieron para mí, pero como señaló @ alex-paliurush, hay algunos escenarios en los que la solución simplemente no funciona. Agregaré un PR en su lugar.
Jisse Reitsma
Gracias Bryan por tu sugerencia también. Sin embargo, el compositor es perfecto cuando se trata de sitios de producción, pero estaba buscando una mejor manera de desarrollar módulos personalizados. Composer aún no debería estar en juego, porque es la forma de distribuir el código que necesito desarrollar primero en Magento 2, por lo que Composer siempre tiene varios commits detrás. Dicho esto, PhpStorm (y otros IDEs) ya ofrecen una solución para esto. Entonces, el único problema que queda es que los sitios de producción sufren de esta limitación de enlace simbólico, y luego sus argumentos
entran
3

Si desarrolla utilizando PHP Storm, simplemente copie el segundo repositorio a la raíz del proyecto Magento. Luego cree los enlaces simbólicos necesarios para habilitar el módulo. PHP Storm tratará este proyecto como multirraíz y reconocerá ambos repositorios. Puede elegir entre estrategias de administración de repositorios síncronas y asíncronas (predeterminadas) .

Este problema también ocurre cuando EE (o cualquier otro módulo) está vinculado a CE mediante enlaces simbólicos. La causa raíz es que registration.phpcalcula la ruta del módulo base como ruta real al directorio (en su caso, está fuera del proyecto Magento). Es por eso que la ruta relativa se calcula incorrectamente, y luego la ruta absoluta también es incorrecta. Si el segundo repositorio se coloca bajo la raíz de Magento, la ruta relativa apuntaría a la ruta real del archivo (no al enlace simbólico), pero aún se encontraría, por lo que todo funcionará.

Alex Paliarush
fuente