마 젠토 2 :`setup : di : compile` 실행 **** 특정 모듈 만?


33

하나의 특정 모듈에 대한 코드를 미리 생성 할 수 있습니까? IE- 시스템에서 모든 코드를 생성 할 수 있습니다.

php bin/magento setup:di:compile

그러나 시간이 오래 걸릴 수 있습니다. 특정 모듈의 파일 미리 생성하고 싶습니다 .

php bin/magento setup:di:compile Pulsestorm_Commercebug

해결하려는 특정 문제는 일부 플러그인 개발자 / 기본 모드에서 인식되지 않는 이 문제 를 해결하는 것입니다 .


최신 "Open Questions"기사를 읽은 후 답변이 업데이트되었습니다. 질문에 대한 직접적인 대답은 다음과 같습니다. 해결하기가 복잡하지 않습니다. 결코 필요한 것으로 간주되지 않았기 때문에 구현되지 않았습니다.
Anton Kril

하나의 모듈에서 '컴파일'하는 능력을 갖추면 모듈 개발에서 문제를 디버깅 할 때 많은 시간을 절약 할 수 있습니다.
Karen Baker

답변:


19

짧은 답변 : 아니요. 현재 Magento와 함께 제공되는 도구로는 불가능합니다.

설명 : 코드 생성컴파일 을 구별해야합니다 . 컴파일러는 두 가지를 모두 수행합니다. 두 가지 작업 모두 다른 모든 마 젠토 모듈의 구성을 읽어야합니다.

magento는 하나의 모듈에 대해서만 컴파일 된 구성으로 작동하지 않기 때문에 하나의 모듈에 대한 컴파일 은 의미가 없습니다.

하나의 모듈에 대한 생성 은 의미가 있지만, 설치된 다른 모든 모듈에서 구성 및 생성자 서명을 읽어야합니다. 그렇지 않으면 모든 코드가 생성되지 않을 수 있습니다. 따라서 이러한 작업은 전체 컴파일보다 훨씬 빠르지 않습니다. 우리는 그것을 생각할 수도 있지만 명령을 구현하기 전에 참조 한 버그가 수정 될 것이라고 생각합니다.


1
개발 중에 어딘가에 새로운 의존성 주입 인수가 추가 될 때마다 다시 컴파일 해야하는 고통이 있습니다. 개발 중에 코드 생성을 완전히 우회하는 방법이 있습니까?
snez

6
개발 중에 컴파일러를 실행할 필요가 없습니다. 메소드 서명을 수정하는 경우 여전히 / generation 디렉토리를 지워야하지만 컴파일이 필요하지 않습니다. 컴파일은 프로덕션으로 전환하기위한 것입니다.
Anton Kril

12

Magento의 bin/magento실행 파일은 Symfony Console 구성 요소 일뿐입니다. 즉, 단일 명령에 대한 개별 파일을 찾을 수 있습니다. setup : di : compile의 경우 이름이 항상 동일하므로 DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php)를 찾을 수 있습니다 .

항상 exeucte()메서드를 실행하여 살펴보아야합니다. 이 함수에서 $operationsvar가 설정되어 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.

물론, 우리는 많은 것들을 잘라 냈기 때문에 이것이 예상되었습니다. 하지만 당신은 지정하지 않은 어떤 당신이 생성 한 할 파일. 예를 들어, 차단 클래스는 여러 모듈에 종속 될 수 있으므로 하나의 모듈에 대해서만이 기능을 실행하면 기능 출력이 제한적이므로 모든 파일을 모듈별로 생성 할 수있는 것은 아닙니다.

담당 발전기를 여기서 찾을 수 있습니다.

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

각 클래스에는 foreach가 있으며 특정 모듈 / 경로를 계속 건너 뛰고 if / else를 추가 할 수 있습니다. 명령에 인수를 공급하는 방법에 대한 Symfony 콘솔 구성 요소 입력 인수 문서 를 확인하는 것이 유용 할 수 있습니다 .


유용한 정보는 +1이지만 "그러나 생성하려는 파일을 지정하지 않았습니다". 그것은 기술적으로 정확하지만 문제의 암시는 내 모듈의 모드를 생성하고 모듈에서 사용했기 때문에 생성 해야하는 추가 코드를 원합니다. 내 목표는 하나의 모듈에서 작업하기 때문에 전체 시스템을 컴파일 할 필요가 없습니다.
Alan Storm

3

당신은에 의해 인식 할 수 있습니다

패키지> 모듈> registration.php

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

그리고 달리기보다

PHP -f bin / magento 모듈 : 활성화 --clear-static-content 패키지 _ 모듈

registration.php는 모듈을 인식하고 사용자 정의 모듈을 준수합니다.

이것이 도움이되기를 바랍니다.


2
유용한 정보이지만 내가 찾던 것은 아닙니다. 컴파일하려는 정적 컨텐츠가 아니며 setup : di : compile을 실행할 때 실행되는 생성입니다. 그것은 다른 것입니다.
Alan Storm

-3

이전 요청에서 생성 된 클래스의 생성자를 변경하면 중단됩니다. 당신이 그런 요구에 있으면 간단하게 삭제 var/cache, var/generation그리고 var/di(있는 경우) 및 페이지를 새로 고칩니다. 모드가 작업중인 개발자인지 확인하십시오.

(이 방법으로 magento가 코드베이스를 컴파일하거나 생성하지 않을 것입니다. 예, 그렇게 할 것입니다. 이렇게하면 경로 나 클래스를 변경할 때마다 "setup : di : compile"을 실행하지 않아도됩니다)


이것은 다른 질문에 대답하는 것 같습니다.
Alan Storm

대답은 위에서 Anton Kril에 의해 이미 주어졌으며, 이는 매우 직설적이고 논리적입니다. 방금 명령을 실행하고 컴파일이 실행될 때까지 화면을 볼 수없는 대체 솔루션을 제공하려고했습니다. 이렇게하면 시간을 절약 할 수 있습니다. 답변은 질문과 거의 관련이 있습니다. 이것이 당신의 태도라면 아무도 해결책과 생각을 생각해 낼 수 없습니다.
Laxman Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.