VCS 하에서 Magento 2 프로젝트의 기본 구조는 무엇입니까?


15

새 M2 프로젝트를 시작할 때 가장 먼저 할 일은 composer를 통해 코어를 설치하는 것입니다.

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition

이제에서 사용자 정의 모듈 및 테마를 작성할 수 있습니다 app/code. 그런 다음 내 폴더 composer.*와 전체 app/code폴더를 VCS에 추가합니다. 지금까지 모든 것이 정상입니다.

이제 프로젝트에 빌드 도구를 사용하고 싶다고 가정 해 봅시다. Grunt 또는 Gulp라고합시다.

  1. 내 자신을 커밋 하면 리포지토리를 복제 한 후 실행할 때 패키지 Gruntfile.js가 덮어 씁니다 .magento/magento2-basecomposer install

  2. 내 커밋하면 gulpfile.js, 나는 정말 내 종속성을 정의 할 수 없습니다 package.json그것은 또한 덮어 쓰기 때문에, magento/magento2-base.

  3. Magento 's Grunt 설정을 사용하기로 결정하고 /dev/tools/grunt(예 :) 아래의 파일을 편집하여 사용자 지정하려는 경우 themes.js변경 사항이로 덮어 쓰기 때문에 수정할 수 없습니다 magento/magento2-base.

내 이해는 문서 루트에서 실제로 많은 것을 할 수 없다는 것입니다. 물론이 문제에 대한 많은 해결책이 있습니다.

  • git checkout -설치 후 바로 자신의 파일을 재설정 할 수 있습니다.
  • /build예를 들어 빌드 파일을 전용 폴더에 저장할 수 있습니다.
  • Phing, Ant 또는 Rake와 같은 다른 빌드 도구를 사용할 수 있습니다 (프론트 프론트 개발자는 그렇게 행복하지 않을 것입니다)
  • magento/magento2-base핵심 파일에 대한 사용자 정의 매핑이있는 사용자 정의 패키지로 바꿀 수 있습니다 (실제로는 최적은 아니지만 옵션입니다)

나는 개인적으로 이러한 모든 옵션을 싫어하므로 내가하려는 일을 달성하기 위해 선호되거나 더 나은 방법이 있는지 알고 싶습니다.

누구 같은 문제가 있습니까? 어떻게 해결 했습니까? VCS에서 프로젝트를 어떻게 구성합니까?

최신 정보

프로젝트 설정과 관련된 추가 사항. 실험에서 Magento composer 설치 프로그램에는 파일 재정의 플래그가 있음을 알았습니다.

"extra": {
    "magento-force": "override"
}

실수하지 않으면 내부적으로 부울로 처리되므로 false재정의를 건너 뛰 도록 설정하려고했습니다 . composer install파일을 이미 설치했기 때문에 설치를 실행할 때 실패합니다. 기본적으로 Magento가 내 파일을 재정의하지 못하게하면 설치할 수 없습니다.

이 깃발의 목적은 무엇입니까? 나를 위해 검사를 수행한다고 가정합니까? 솔직히 말이별로 의미가 없지만 어쩌면 누군가가 그 주제를 밝힐 수 있습니다.


다른 사람들이 답변으로 게시 한 내용이 궁금합니다. 이상적으로는 Magento Core를 기본 리포지토리에서 제외하고 생성 한 템플릿과 추가하거나 올바르게 정의한 사용자 지정 플러그인으로 만 제한하고 싶다고 생각합니다. 그런 다음 빌드 타임에 핵심 + 프로젝트 저장소를 참조하고 리포지토리에서 응용 프로그램 아티팩트를 빌드합니다. 이것은 최근 M1에 사용했던 방법이며 Magento의 공식 권장 사항이 Composer가 완전히 지원되므로 M2와 비슷한 작업을 수행 해야하는지 궁금합니다.
Bryan 'BJ'Hoffpauir Jr.

M2 최신 버전에서는 Gruntfile.js, gulpfile.jspackage.json문제가 해결된다. 문제는이 질문에 주소를 변경할 필요가있을 때 여전히 새로운 젠토 2 버전에 적용 할 수있다 themes.js, index.php또는 .htaccess예를 들어.
7ochem

답변:


4

간단히 말해서, 우리는 사용자 정의가 필요한 파일을 분리하려고합니다. 예를 들어 사람들이 index.php를 수정해야하는 경우 Magento가 제공하는 표준 파일을 로컬 사용자 지정의 필요와 분리하는 방법을 알아 봅니다. 일단 달성되면 "모든 프로젝트에 사용할 수있는 하나의 진정한 .gitignore"를 가질 수 있습니다. 즉, "composer install"이 가져올 모든 것을 .gitignore를 사용하여 전체 프로젝트 디렉토리를 Git에 쉽게 커밋 할 수 있습니다 (패치 또는 업그레이드를 설치할 때 "composer update"가 모두 대체 됨).

장기적으로 목표는 가능한 한 .gitignore를 줄이는 것입니다. 예를 들어 '공급 업체'디렉토리 아래의 모듈에 더 많은 정보를 넣습니다.

그때

  1. 프로젝트간에 공유하고 싶지 않은 모든 것을 앱 / 코드 아래에두고 기본 프로젝트 저장소에 커밋하십시오.
  2. 로컬에서 개발 한 모든 프로젝트에서 프로젝트를보다 쉽게 ​​공유하고 별도의 GIT 리포지토리에 넣고 작곡가를 통해 설치하여 '공급 업체'아래에있게됩니다. (로컬 작곡가 저장소이거나 GIT에서 바로 설치할 수 있습니다.)

그렇게하면 composer.json 및 composer.lock 파일을 캡처하여 전체 프로젝트 트리를 위에서 아래로 계속 커밋 할 수 있습니다 (앱 / 코드를 커밋하는 것은 아닙니다). .gitignore는 'vendor'디렉토리와 원하지 않는 다른 파일을 제외합니다.

이것은 당신에게 다른 토론에서 언급 된 두 세계의 최고를 제공합니다. 현재 고통은 .gitignore 파일의 길이와 복잡성이며, 패치 설치는 현재 일부 로컬 사용자 정의를 제거합니다 (예 : index.php). 단기 해결 방법-.gitignore에서 index.php를 제거하고 패치를 설치할 때 손실 된 변경 사항 (git diff)을 확인하고 수동으로 다시 적용하십시오.


그래, 가까운 미래에 몇 가지를 바꿀 것입니다. 이 "magento-force": "override"플래그가 어떻게 든 유용 할 수 있는지 궁금합니다 . 현재로서는 내가 기대하는 것을 정확하게하지 않습니다. 자신 index.php또는 다른 "핵심"파일 을 편집 / 확장 한 경우 변경 내용을 덮어 쓰지 않도록 Magento에 지시 할 수 있습니다. 말이 되나요?
fmrng

3

재정의에 대한 쉬운 해결책이 있습니다. 문제 : 핵심 파일을 변경하지 마십시오.;) Magento는 코드 확장과 코드 변경을 기반으로합니다.

첫 번째는 전체 앱 / 코드 폴더를 하나의 vcs 저장소에두면 안됩니다. 각 Magento 구성 요소 (모듈, 테마 등)는 저장소 자체 여야합니다.

프론트 엔드를 변경 / 확장하려면 새 테마를 작성하고이 테마를 전체 Magento2 인스턴스가 아닌 그런 프로젝트로 취급해야합니다.

프로젝트에 테마를 설치하려면 vcs 저장소에서 직접 작곡가를 통해 테마를 쉽게 가져올 수 있습니다


음, app/code폴더는 특히 Magento를 사용자 정의하기 위해 존재합니다. 현재 M2에 대한 나의 이해는 M1에 있던 것을 app/code대체 app/code/local하고 커뮤니티 모듈은 아래의 composer를 통해 설치할 수 있다는 것 vendor입니다. 우리는 많은 수의 모듈과 몇 가지 테마를 가진 프로젝트를 가지고 있습니다. 당신이 제안하는 것은 관리가 불가능할 것입니다.
fmrng

우리는 그 방법으로 100 개가 넘는 컴포넌트로 프로젝트를 관리합니다. 핵심은 모듈을 작게 유지하고 모듈 간의 작곡가 종속성을 관리하는 것입니다. 필요에 따라 magento 프로젝트 저장소를 복제하고 모든 컴포넌트를 프로젝트에 추가 할 수 있습니다
David Verholen

현재 설정에 만족하면 괜찮습니다. 솔직히, 나는 다소 번거 롭습니다. 즉, 100 개 이상의 git 저장소가 있으며 무언가를 변경할 때마다 특정 프로젝트를 열고 변경 사항을 커밋하고 실행해야합니다 composer update. 당신은 composer.lock그때 어디에 커밋 합니까? 같은 프로젝트에서 10 명 이상의 개발자가 작업하고 있다면 정말 지저분해질 수 있습니다. 물론 우리는 작곡가를 통해 설치하는 많은 일반 모듈 (그리고 테마조차도)을 가지고 있지만 명확성을 기하기 위해 프로젝트 별 코드는 동일한 저장소 아래에 버전 화되어야합니다.
fmrng

나는 당신이 잘못하고 있다고 말하는 것이 아닙니다. 내 취향에 비해 약간 복잡하다고 생각합니다. 관심이 없다면, 그러한 설정으로 레포 기록을 어떻게 검사합니까? 어떻게 같은 기능을 사용할 수 있습니다 git blame또는 git log코드가 여러 구성 요소에 흩어져 때? 통합 테스트를 실행하여 모든 것이 제대로 작동하는지 확인합니까?
fmrng

작년에이 토론을 내부적으로 진행했으며 1repo = 1 모듈로 결정한 이후 배포가 다소 단순 해졌습니다. 요점은 하나의 작은 변화에 대해 작곡가를 업데이트하지 않을 것입니다. 개발자는 개발 환경에서 작업하고 파일을 직접 변경합니다. 완료되면 알파, 베타 또는 릴리스 후보로 태그를 지정할 수 있습니다. 이런 식으로 여러 개발자가 동시에 많은 프로젝트에서 작업 할 수 있으며 다음에 모든 변경 사항을 가져 오는 작곡가 업데이트를 작성합니다.
vc

2

좋아, 내가 달성하려는 것에 대한 더 나은 해결책을 찾은 것 같습니다. 에서 composer.json, 젠토 작곡가 설치 프로그램에 의해 무시되어야하는 파일을 지정할 수 있습니다. Gruntfile.js재정의 하지 않으려면 다음 구성으로 간단히 지정할 수 있습니다.

"extra": {
    "magento-deploy-ignore": {
        "magento/magento2-base": [
            "/Gruntfile.js",
            "/package.json"
        ]
    }
}

이제 필요에 맞게 표준 설치를 확장 할 수 있습니다.


이 솔루션은 "업그레이드 안전"으로 보이지 않습니다. Magento가 무시한 파일을 변경하면 해당 파일을 알지 못하거나 잊어 버립니다. 이 새로운 변경 사항을 포함하지 않는 자신의 버전을 사용하고 있습니다. 내 제안에 대한 답변을 확인하십시오.
7ochem

2

불행하게도 허용 대답, 방법은 원래 우리가 예. (하위 디렉토리에 배치 파일을 제외 할 경우 때문에, 원하는 목표 루트에 배치 파일과 디렉토리를 제외하고 만 일을 달성하도록 구성되어 있지만, dev/tools/grunt/configs/themes.js우리가를 추가하는 경우, 필요를 "magento-deploy-ignore"구성에 배치하여 모든 상위 디렉토리 (즉, dev 및 모든 서브 디렉토리)의 배치를 차단합니다.

이는 "magento-deploy-ignore"( \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored) 를 처리하는 메소드가 strpos대상 경로를 제외 목록과 일치시키는 데 사용 되므로 모든 상위 경로는 항상 true를 반환하기 때문입니다.


테스트에서 볼 수 있지만 다른 빌드 워크 플로우를 사용하고 있기 때문에 atm에 잘 작동합니다. 더 나은 옵션을 찾을 수 있습니까?
fmrng

파이프 라인의 빌드 단계에서 파일 체크 아웃을 시작한 후 모든 내장 Grunt 작업에서 사용을 중단 했으므로 문제가되지 않습니다.
Gennaro Vietri

그건 그렇고, 우리는 "magento-deploy-ignore"동작을 향상시키기 위해 포크 magento-composer-installer의 평가를 시작했습니다. 문제가 다시 나타날 경우이 경로를 따라갈 수 있습니다
Gennaro Vietri

0

패치 사용

내가 사용하는 것은 패치를 만들고 적용하는 것입니다. 우리가 변화를 필요로 할 때 dev/tools/grunt/configs/themes.js, index.php또는 .htaccess우리가 파일의 임시 사본에 변경 사항을 적용하고 그것에서 패치를 생성 (A 만들 build/처음 일세) :

$ cp dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp
  # Now Make changes in .tmp file
$ diff -u3 dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp | sed 's/\.tmp//' > build/themes.patch
$ mv dev/tools/grunt/configs/themes.js.tmp dev/tools/grunt/configs/themes.js

그런 다음 실행시 composer install또는 파일 섹션에 updatete 명령을 추가 하여이 패치를 자동으로 적용 할 scriptscomposer.json있습니다.

{
    "scripts": {
        "post-install-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js",
        "post-update-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js"
    }
}

(또한 위의 patch ...명령을 bash 스크립트에 넣을 수 build/themes_patch.sh있습니다. Composer에서 해당 스크립트를 호출하여 재사용 가능하거나 수동으로 실행할 수 있도록하십시오.)

안전 업그레이드! :디

이 솔루션은 업그레이드 안전합니다! 원본 파일을 고려하지 않고 코어 파일을 직접 변경하지 않습니다. 원본 Magento2 파일에 패치를 적용하고 있습니다. 업그레이드 중이므로 해당 파일이 변경되면 패치가 실패하고 새 변경 사항을 자세히 살펴보고 새 패치를 만들어야한다는 것을 알게됩니다.

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