是否可以为一个特定的模块预先生成代码?IE浏览器-我可以使用以下命令生成系统中的所有代码
php bin/magento setup:di:compile
但是,这可能需要很长时间。我想预先生成只针对特定模块的文件。
php bin/magento setup:di:compile Pulsestorm_Commercebug
我要解决的特定问题是解决此问题,有些插件在开发人员/默认模式下无法识别。
是否可以为一个特定的模块预先生成代码?IE浏览器-我可以使用以下命令生成系统中的所有代码
php bin/magento setup:di:compile
但是,这可能需要很长时间。我想预先生成只针对特定模块的文件。
php bin/magento setup:di:compile Pulsestorm_Commercebug
我要解决的特定问题是解决此问题,有些插件在开发人员/默认模式下无法识别。
Answers:
简短的回答:不可以。这是现在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.
当然,这是可以预期的,因为我们削减了很多东西。但是你没有指定哪个你想已生成的文件。并非所有文件都可以在每个模块的基础上生成,因为例如Interception类可以依赖于多个模块,因此,如果仅对一个模块运行此功能,则只能提供有限的功能输出。
您可以在此处找到负责的生成器;
设置/ src / Magento /设置/模块/ Di / App /任务/操作/
每个类中都有一个foreach,它将允许您添加if / else并继续跳过某些模块/路径。可能有必要查看有关如何将参数输入命令的Symfony控制台组件输入参数文档。
您可以通过识别
包>模块> 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将识别该模块并编译您的自定义模块。
我希望这能帮到您。
当您更改上一个请求中生成的类的构造函数时,它将中断。如果您有这种需要,只需删除var/cache
,var/generation
和var/di
(如果存在)并刷新页面。确保模式是您正在使用的开发人员。
(我并不是说magento不会编译或生成代码库,是的。这样做,每次在路由或类中进行更改时,运行“ setup:di:compile”都会有所缓解)