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


33

是否可以为一个特定的模块预先生成代码?IE浏览器-我可以使用以下命令生成系统中的所有代码

php bin/magento setup:di:compile

但是,这可能需要很长时间。我想预先生成针对特定模块的文件。

php bin/magento setup:di:compile Pulsestorm_Commercebug

我要解决的特定问题是解决此问题,有些插件在开发人员/默认模式下无法识别。


阅读您最新的“开放式问题”文章后,更新了我的答案。问题的直接答案是:不。解决起来并不复杂。它只是没有实施,因为从来没有考虑过需要它。
安东·克里尔

获得在一个模块上“编译”的能力将是很棒的,在调试模块开发中的问题时可以节省很多时间。
卡伦·贝克

Answers:


20

简短的回答:不可以。这是现在Magento附带的工具无法实现的。

说明:我们必须区分代码生成编译。编译器会同时执行。对于这两种操作,我们都需要读取所有其他magento模块的配置,否则它们的输出将不正确或不完整。

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

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


1
在开发过程中每次在某个位置添加新的依赖项注入参数时都不得不重新编译,这是一种痛苦,是否有一种方法可以在开发过程中完全绕过代码生成?
snez

6
在开发过程中,您不必运行编译器。如果您修改方法签名,则仍然必须清除/ generation目录,但是不需要编译。编译仅适用于生产。
安东·克里尔

12

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.

当然,这是可以预期的,因为我们削减了很多东西。但是你没有指定哪个你想已生成的文件。并非所有文件都可以在每个模块的基础上生成,因为例如Interception类可以依赖于多个模块,因此,如果仅对一个模块运行此功能,则只能提供有限的功能输出。

您可以在此处找到负责的生成器;

设置/ src / Magento /设置/模块/ Di / App /任务/操作/

每个类中都有一个foreach,它将允许您添加if / else并继续跳过某些模块/路径。可能有必要查看有关如何将参数输入命令的Symfony控制台组件输入参数文档。


+1可获取有用的信息,但是请重新输入:“但是,您没有指定要生成的文件”。从技术上讲,这是正确的,但问题中隐含着这样的愿望:要生成模块的模式,然后要生成任何其他代码,因为我已经在模块中使用了它。我的最终目标不是仅仅因为我在一个模块上工作就需要编译整个系统。
艾伦·斯托姆

3

您可以通过识别

包>模块> registration.php

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

然后跑

php -f bin / magento模块:启用--clear-static-content Package_Module

registration.php将识别该模块并编译您的自定义模块。

我希望这能帮到您。


2
有用的信息,但不是我想要的信息。这不是我要编译的静态内容,而是运行setup:di:compile时生成的内容。那是另一回事。
艾伦·斯托姆

-3

当您更改上一个请求中生成的类的构造函数时,它将中断。如果您有这种需要,只需删除var/cachevar/generationvar/di(如果存在)并刷新页面。确保模式是您正在使用的开发人员。

(我并不是说magento不会编译或生成代码库,是的。这样做,每次在路由或类中进行更改时,运行“ setup:di:compile”都会有所缓解)


这似乎在回答一个不同的问题。
艾伦·斯托姆

上面的答案已经由安东·克里尔(Anton Kril)给出,这是非常直接的,在逻辑上是正确的。我只是想给您一个替代解决方案,该解决方案不允许您运行命令并监视屏幕,直到编译运行为止。这样做可以节省您的时间。答案与您的问题息息相关。如果这是您的态度,那么没人会提出解决方案和想法。
Laxman Singh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.