Magento 2는 심볼릭 링크를 사용한 모듈 연결을 허용하지 않습니다


10

심볼릭 링크를 사용하여 Magento 2에 로컬 개발 모듈 (별도의 git repo)을 추가했으며 PHTML 템플릿을 사용할 때까지 정상적으로 작동했습니다. 무거운 디버깅 후 Magento 2 파일 시스템 클래스 ( Magento\Framework\Filesystem\Directory\Read)는 호출 isExists()과 결합 된 메소드를 사용 getAbsolutePath()하여 PHTML 템플릿이 존재하는지 확인했습니다. 그러나이 getAbsolutePath()방법은 상대 경로가 Magento 2 파일 시스템 내에 존재하는지 확인하고 그렇지 않은 경우 Magento 2 루트 앞에 붙습니다. 그것. 필자의 경우 모듈은 별도의 저장소에 /git/A있고 Magento는 살고 /site/B있으며이 동작은에서 PHTML 템플릿이 있는지 확인합니다 /site/B/git/A.

한마디로 : Magento 2 루트 파일 시스템 외부에있는 PHTML 템플릿은 시스템 구성 설정 "Symlink 허용"이 설정되어 있는지 여부에 관계없이 선택되지 않습니다. symlink의 소스가 여전히 Magento 2 파일 시스템 내에있는 경우에만 설정이 작동하는 것 같습니다.

다른 사람이 이것을 만났습니까? 외부 자식 저장소에서 개발을 처리하는 가장 좋은 방법은 무엇입니까?


50/50 버그 / 기능. 문제를 제기 한다고 합니다 .
benmarks

@benmarks workaroud을 가지고이 알려진 문제는 내 대답을 참조
알렉스 Paliarush

답변:


9

모듈에 composer 경로 저장소 를 사용하는 경우 해시 해결 방법 .

registration.php넣어 :

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Module_Name',
    isset($file) ? dirname($file) : __DIR__
);

그러면 실제 경로 대신 Magento의 루트 공급 업체 디렉토리의 심볼릭 링크 경로에 모듈이 등록됩니다.


1
이 솔루션은 Magento 2.3으로 업그레이드 할 때까지 나에게 도움이되었습니다 ( '잘못된 템플릿 파일 ...'오류가 발생합니다). 어떻게 해결할 수 있습니까?
Pini

죄송합니다 symlink를 사용하지 않을 때 이것이 작동합니까? 그렇다면 M2.3이 템플릿을로드하는 방법을 디버깅해야합니다. 다른 질문이 있을까요?
fsw December

심볼릭 링크없이 작동합니다.
Pini

개발 중에 Vagrant를 사용합니다. 에 심볼릭 링크 /vagrant/app/code/Vendor//var/www/shop/app/code/Vendor있습니다. 이것은 나를 위해 그것을 해결했습니다!
BugHunterUK

돌아 왔어요 이 솔루션은 작동하지 않습니다. 이것을 사용하여 모듈 코드를 심볼릭 링크하면 모듈의 관리 HTML 경로가 작동하지 않습니다. symlink를 제거하고 파일을 app / code 디렉토리에 복사하여이를 확인했습니다. 그런 다음 플러그인이 작동했습니다. 이 모듈을 생성하고 심볼릭 링크를 통해 확인할 수 있습니다 : devdocs.magento.com/guides/v2.3/ext-best-practices/… ... 내가했던 것과 같은 문제가 발생합니다.
BugHunterUK

4

dev 루트를 가리 키도록 registration.php를 조작 할 수도 있습니다.

그것이로드되도록 부트 스트랩 프로세스 어딘가에 registration.php를 실행해야합니다.

가장 쉬운 방법은 composer를 통해 설치하지 않고 vendor / composer / autoload_files.php에 수동으로 추가하는 것입니다.

나는 이것을 위해 모듈을 작성하는 것에 대해서도 생각했다. 이 모듈은 통합 테스트 환경에 유용 할 수 있습니다 (어딘가에 모듈을 복사하지 않고도 모듈을 즉시 추가 및 제거).

=== 업데이트 ===

지금까지 나는 모듈을 썼습니다 : http://github.com/davidverholen/magento2-dynamic-component-registry

또한 상대 심볼릭 링크를 사용하여 모듈을 연결할 수 있어야한다고 생각합니다.


3

Stores => Configuration => Advanced => Developer => Template Settings (Magento 1.x에서와 같이)를 통해 심볼릭 링크를 활성화 / 허용 할 수 있습니다.

구성 옵션

(이 설정이 작동하는지 테스트하지 않았습니다)

또한 서브 링크를 사용할 수 있으므로 심볼릭 링크가 필요하지 않습니다.

개발을 위해 별도의 디렉토리에 모듈을 개발하고 PHPStorm을 사용하여 Magento 2 개발 설치에 모듈을 복사합니다.


1
감사. 내가 언급 한 설정은 "템플릿 설정"아래의 "심볼 링크 허용"설정이었습니다. Magento 1.x에서는 잘 작동하지만 이제 Magento 2에서는 파일이 Magento 루트 내에 있어야하므로 파일 시스템의 아무 곳이 아니라도 필요합니다. 어쨌든, 난 괜찮을거야-아마 서브 모듈을 사용할 것입니다 :)
Jisse Reitsma

Jisse, 그냥 생각해 ... 빌드 아티팩트를 생성 할 때 composer를 사용하여 별도의 모듈을 조립 할 수 있습니다 .git 서브 모듈로 인해 발생할 수있는 문제를 피하는 경향이 있지만 빌드의 복잡성을 더할 수 있습니다 방법. AFAIK, 이것은 상황을 처리하는 Magento의 권장 방법입니다.
Bryan 'BJ'Hoffpauir Jr.

고맙게도 PHPStorm 옵션이 이미 해결되었지만 @ alex-paliurush가 지적했듯이 해결 방법이 작동하지 않는 몇 가지 시나리오가 있습니다. 대신 PR을 추가하겠습니다.
Jisse Reitsma

귀하의 제안에 감사드립니다. 그러나 작곡가는 프로덕션 사이트를 다룰 때 완벽하지만 사용자 정의 모듈을 개발하는 더 좋은 방법을 찾고있었습니다. 작곡가는 아직 Magento 2 내에서 개발해야하는 코드를 배포하는 방법이기 때문에 작곡가가되어서는 안됩니다. 따라서 작곡가는 항상 다양한 커밋 뒤에 있습니다. PhpStorm (및 기타 IDE)은 이미 이에 대한 솔루션을 제공하고 있습니다. 남아가 생산 현장이 심볼릭 링크 제한으로 고통이며, 다음 인수가 :)에서 킥하는 유일한 문제는 그래서
Jisse Reitsma

3

PHP Storm을 사용하여 개발하는 경우 두 번째 저장소를 Magento 프로젝트 루트에 복사하십시오. 그런 다음 필요한 심볼릭 링크를 만들어 모듈을 활성화하십시오. PHP Storm은이 프로젝트를 다중 루트로 취급하고 두 저장소를 모두 인식합니다. 동기식 저장소 와 비동기식 (기본) 저장소 관리 전략 중에서 선택할 수 있습니다 .

이 문제는 EE (또는 다른 모듈)가 심볼릭 링크를 사용하여 CE에 연결된 경우에도 발생합니다. 근본 원인은 registration.php기본 모듈 경로를 디렉토리의 실제 경로 (귀하의 경우 Magento 프로젝트 외부에 있음)로 계산하는 것입니다. 그렇기 때문에 상대 경로가 잘못 계산 된 후 절대 경로도 올바르지 않습니다. 두 번째 저장소가 Magento 루트에 배치되면 상대 경로는 실제 파일 경로 (symlink가 아님)를 가리 키지 만 여전히 발견되므로 모든 것이 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.