当前位置: 首页>>WEB开发>>正文


Magento 2:运行`setup:di:compile` ** ** **特定模块?

webfans WEB开发 , , , 去评论

问题描述

是否有可能为一个特定模块的pre-generate代码? I.E. – 我可以生成系统中的所有代码

php bin/magento setup:di:compile

但是,这可能需要很长时间。我想pre-generate只有特定模块的文件。

php bin/magento setup:di:compile Pulsestorm_Commercebug

我正在尝试解决的具体问题是解决this issue问题,其中一些插件在开发人员/默认模式下无法识别。

最佳解决方案

简答:不。现在Magento随附的工具无法实现。

说明:我们必须区分代码生成和编译。编译器同时做到了。对于这两个操作,我们需要读取所有其他magento模块的配置,否则它们的输出将不正确或未满。

一个模块的编译没有意义,因为magento不能仅用于一个模块的编译配置。

生成一个模块可能有意义,但我们必须从所有其他已安装的模块中读取配置和构造函数签名。没有它,不会生成所有代码。所以这样的操作不会比完全编译快得多。我们可能会想到它,但我认为您引用的错误将在命令实现之前得到修复。

次佳解决方案

Magento的bin/magento可执行文件只是一个Symfony控制台组件。这意味着您可以找到单个命令的单个文件。命名总是一样的,所以对于setup:di:compile你可以找到DiCompileCommand.php(setup/src/Magento/Setup/Console/Command/DiCompileCommand.php)。

它将始终运行exeucte()方法,以便我们需要查看。在此函数中,您将看到设置了$operations var,它由getOperationsConfiguration()方法填充。这个方法基本上告诉DiCompileCommand要编译什么。

我尝试的第一件事就是返回应用程序代码生成器部分,就像这样;

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,
        ]
    ];
}

这很顺利,编译时间大幅减少;

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

相反;

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

当然,这是预料之中的,因为我们删除了许多东西。但是您没有指定要生成的文件。并非所有文件都可以在per-module的基础上生成,因为例如,拦截类可以依赖于多个模块,因此如果您只为一个模块运行它,则会为您提供有限的功能输出。

你可以在这里找到负责任的发电机;

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

每个类都有一个foreach,它允许你添加一个if /else并继续跳过某些模块/路径。也许查看有关如何将参数提供给命令的Symfony Console Component Input Arguments文档是有用的。

第三种解决方案

你可以认识到

包> >模块为registration.php

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

而不是跑

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

registration.php将识别模块并压缩您的自定义模块。

我希望这能帮到您。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2835.html,转载请务必附带本地址声明。