Magento 2:「setup:di:compile」を実行する**特定のモジュールのみ?


33

特定のモジュールのコードを事前生成することはできますか?IE- システムですべてのコードを生成できます

php bin/magento setup:di:compile

ただし、これには時間がかかる場合があります。特定のモジュールのファイルのみを事前生成したいのですが。

php bin/magento setup:di:compile Pulsestorm_Commercebug

私が解決しようとしている特定の問題は、開発者/デフォルトモードで認識されない一部のプラグインでこの問題を回避することです。


最新の「未解決の質問」記事を読んだ後、私の回答を更新しました。質問に対する直接的な答えは「いいえ」です。解決するのは複雑ではありません。必要と考えられなかったため、実装されませんでした。
アントンクリル16

1つのモジュールで「コンパイル」できるようになり、モジュール開発の問題をデバッグする際に多くの時間を節約できます。
カレンベイカー

回答:


20

短い回答:いいえ。Magentoに同梱されているツールでは不可能です。

説明:コード生成コンパイルを区別する必要があります。コンパイラーは両方を実行します。どちらの操作でも、他のすべてのmagentoモジュールの構成を読み取る必要があります。そうしないと、出力が正しくないか、いっぱいになりません。

magentoは1つのモジュールのみのコンパイル済み構成では機能しないため、1つのモジュールのコンパイルは意味がありません。

1つのモジュールの生成は理にかなっているかもしれませんが、とにかくインストールされている他のすべてのモジュールから構成署名とコンストラクター署名を読み取る必要があります。それなしでは、すべてのコードが生成されるとは限りません。したがって、このような操作は、完全なコンパイルよりもはるかに高速ではありません。私たちはそれを考えるかもしれませんが、あなたが参照したバグはコマンドが実装される前に修正されると思います。


1
開発中に新しい依存性注入引数が追加されるたびに再コンパイルしなければならないのは非常に苦痛ですが、開発中にコード生成を完全にバイパスする方法はありますか?
-snez

6
開発中にコンパイラを実行する必要はありません。メソッドシグネチャを変更する場合、/ generationディレクトリをクリアする必要がありますが、コンパイルは必要ありません。コンパイルは実稼働への切り替え専用です。
アントンクリル

12

Magentoのbin/magento実行可能ファイルは、Symfonyコンソールコンポーネントです。これは、個々のファイルが単一のコマンドに責任があることを見つけることができることを意味します。命名は常に同じであるため、setup:di:compileにはDiCompileCommand.php(setup/src/Magento/Setup/Console/Command/DiCompileCommand.php)があります。

それは常にexeucte()メソッドを実行するので、それが私たちが見る必要がある場所です。この関数$operationsでは、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.

もちろん、これは多くのことを削減したので予想されていました。しかし、あなたは指定されていませんでしあなたが生成したいファイル。すべてのファイルをモジュールごとに生成できるわけではありません。たとえば、インターセプションクラスは複数のモジュールに依存する可能性があるため、1つのモジュールに対してのみ実行すると機能の出力が制限されます。

責任あるジェネレーターはここで見つけることができます。

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

各クラスにはforeachがあり、特定のモジュール/パスをスキップし続けるif / elseを追加できます。コマンドに引数を渡す方法については、Symfony Console Component Input Argumentsのドキュメントをチェックすると便利かもしれません。


有用な情報については+1ですが、「ただし、生成するファイルを指定しませんでした」それは技術的には正しいのですが、モジュールのモードを生成し、それをモジュールで使用したために生成する必要のある追加のコードを作成したいという疑問が暗黙のうちにあります。私の最終目標は、1つのモジュールで作業しているからといって、システム全体をコンパイルする必要がないことです。
アランストーム

3

あなたが認識することができます

パッケージ>モジュール> 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はモジュールを認識し、カスタムモジュールをコンパイルします。

これがお役に立てば幸いです。


2
有用な情報ですが、私が探していたものではありません。これはコンパイルしたい静的コンテンツではなく、setup:di:compileを実行したときに実行される生成です。それは別のことです。
アランストーム

-3

前の要求で生成されたクラスのコンストラクターを変更すると、壊れます。あなたは、このようなニーズにある場合は、単に削除var/cachevar/generationおよびvar/di(存在する場合)、ページを更新します。モードが作業中の開発者であることを確認してください。

(この方法でmagentoがコードベースをコンパイルしたり生成したりするわけではありません。そうすることで、ルートやクラスを変更するたびに「setup:di:compile」を実行することで少し安心できます)


これは別の質問に答えているようです。
アランストーム

答えは既に上記のアントン・クリルによって与えられました。それは非常にまっすぐで論理的に真実です。コンパイルが実行されるまでコマンドを実行して画面を見ることができない代替ソリューションを提供しようとしました。この方法で時間を節約できます。答えはあなたの質問にほとんど関連しています。これがあなたの態度なら、誰も解決策や考えを思いつきません。
ラックスマンシン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.