Magento 2: Ejecute `setup: di: compile` ** solo ** ¿un módulo específico?

33

¿Es posible pregenerar código para un módulo específico? IE: puedo generar todo el código en el sistema con

php bin/magento setup:di:compile

Sin embargo, esto puede llevar mucho tiempo. Me gustaría generar previamente solo los archivos para un módulo específico.

php bin/magento setup:di:compile Pulsestorm_Commercebug

El problema específico que estoy tratando de resolver es solucionar este problema con algunos complementos que no se reconocen en el modo desarrollador / predeterminado.

Alan Storm
fuente
Actualicé mi respuesta después de leer su último artículo de "Preguntas abiertas". La respuesta directa a la pregunta es: no. No es complejo de resolver. Simplemente no se implementó porque nunca se consideró necesario.
Anton Kril
sería genial tener la capacidad de 'compilar' en un módulo, ahorraría mucho tiempo al depurar problemas en el desarrollo del módulo.
Karen Baker,

Respuestas:

20

Respuesta corta: No. Eso no es posible con las herramientas enviadas con Magento ahora.

Explicación: Tenemos que distinguir la generación y compilación de código . El compilador hace las dos cosas. Para ambas operaciones necesitamos leer la configuración de todos los demás módulos de magento, de lo contrario su salida será incorrecta o no estará completa.

La compilación para un módulo no tiene sentido, ya que magento no funcionará con la configuración compilada para un solo módulo.

La generación de un módulo puede tener sentido, pero de todos modos tendremos que leer la configuración y las firmas del constructor de todos los demás módulos instalados. Sin él, no se podría generar todo el código. Por lo tanto, dicha operación no sería mucho más rápida que la compilación completa. Podemos pensar en ello, pero creo que el error al que hizo referencia se solucionará antes de que se implemente el comando.

Anton Kril
fuente
1
Es complicado tener que volver a compilar cada vez que se agrega un nuevo argumento de inyección de dependencia en algún lugar durante el desarrollo, ¿hay alguna forma de evitar por completo la generación de código durante el desarrollo?
snez
66
Nunca tiene que ejecutar el compilador durante el desarrollo. Aún tendrá que borrar / directorio de generación si modifica las firmas de método, pero no se necesita compilación. La compilación es solo para cambiar a producción.
Anton Kril
12

El bin/magentoejecutable de Magento es solo un componente de la consola Symfony. Esto significa que puede encontrar el archivo individual responsable de un solo comando. El nombre siempre es el mismo, por lo que para la configuración: di: compile puede encontrar DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Siempre ejecutará el exeucte()método, así que ahí es donde debemos mirar. En esta función, verá que $operationsse establece una var, que se llena con el getOperationsConfiguration()método. Este método básicamente le dice al DiCompileCommand qué compilar.

Lo primero que probé es devolver solo la parte del generador de código de la aplicación, así;

private function getOperationsConfiguration(
    array $compiledPathsList
) {
    $excludePatterns = [];
    foreach ($this->excludedPathsList as $excludedPaths) {
        $excludePatterns = array_merge($excludedPaths, $excludePatterns);
    }

    return [
        OperationFactory::APPLICATION_CODE_GENERATOR => [
            'paths' => [
                $compiledPathsList['application'],
                $compiledPathsList['library'],
                $compiledPathsList['generated_helpers'],
            ],
            'filePatterns' => ['php' => '/\.php$/'],
            'excludePatterns' => $excludePatterns,
        ]
    ];
}

Esto fue bastante bien, el tiempo de compilación se redujo drásticamente;

Compilation was started.
Application code generator... 1/1 [============================] 100% 45 secs 308.8 MiB
Generated code and dependency injection configuration successfully.

Opuesto a;

Compilation was started.
Interception cache generation... 7/7 [============================] 100% 3 mins 377.0 MiBB8 MiB
Generated code and dependency injection configuration successfully.

Por supuesto, esto era de esperarse ya que eliminamos varias cosas. Pero no especificó qué archivos desea generar. No todos los archivos se pueden generar por módulo, ya que, por ejemplo, las clases de Intercepción pueden depender de múltiples módulos y, por lo tanto, le darían una salida limitada de funcionalidad si solo ejecutara esto para un módulo.

Puede encontrar los generadores responsables aquí;

setup / src / Magento / Setup / Module / Di / App / Task / Operation /

Cada clase tiene un foreach, que le permitirá agregar un if / else con un salto continuo para omitir ciertos módulos / rutas. Tal vez sería útil consultar la documentación de Argumentos de entrada de componentes de la consola Symfony sobre cómo alimentar argumentos en el comando.

Peter Jaap Blaakmeer
fuente
+1 para obtener información útil, pero re: "Pero no especificó qué archivos desea generar". Eso es técnicamente correcto, pero está implícito en la pregunta el deseo de que se genere el modo de mi módulo, y luego cualquier código adicional que deba generarse porque lo he usado en mi módulo. Mi objetivo final no es tener que compilar todo el sistema solo porque estoy trabajando en un módulo.
Alan Storm
3

puedes reconocer por

paquete> módulo> registro.php

<?php
use \Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Package_Module', __DIR__);

y que correr

php -f bin / magento module: enable --clear-static-content Package_Module

Registration.php reconocerá el módulo y compilará su módulo personalizado.

Espero que esto ayude.

denish vachhani
fuente
2
Información útil, pero no lo que estaba buscando. No es contenido estático lo que quiero compilar, es la generación que se ejecuta cuando ejecuta setup: di: compile. Eso es algo diferente.
Alan Storm
-3

Cuando cambie su constructor para la clase que se generó en la solicitud anterior, se romperá. Si se encuentra en este tipo de necesidades se limite a eliminar var/cache, var/generationy var/di(si existe) y actualiza la página. Asegúrese de que el modo sea el desarrollador en el que está trabajando.

(No estoy diciendo de esta manera que magento no compilará ni generará código base, sí lo hará. De esta manera, da un poco de alivio al ejecutar "setup: di: compile" cada vez que realice cambios en sus rutas o clases)

Laxman Singh
fuente
Esto parece estar respondiendo una pregunta diferente.
Alan Storm
La respuesta ya fue dada por Anton Kril arriba, eso es muy directo y lógicamente cierto. Solo intenté darle una solución alternativa que no le permitiera ejecutar el comando y mirar su pantalla hasta que se ejecute la compilación. Al hacerlo, puede ahorrar su tiempo. La respuesta está más o menos relacionada con tu pregunta. Si esta es tu actitud, a nadie se le ocurren soluciones y pensamientos.
Laxman Singh