Яка краща структура проекту Magento 2 за VCS?


15

Коли я запускаю новий проект M2, перше, що я зробив би, це встановити ядро ​​за допомогою композитора:

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-baseпакетом, коли я запущу composer installпісля того, як я клонував репо.

  2. Якщо я виконую свою gulpfile.js, я не можу реально визначити свої залежності в a package.json, тому що це також буде переписано magento/magento2-base.

  3. Якщо я вирішу використовувати налаштування Grunt Magento і хочу налаштувати його, редагуючи файли в розділі /dev/tools/grunt(наприклад themes.js), я не можу, тому що мої зміни будуть замінені magento/magento2-base.

Я розумію, що ви не можете дуже багато зробити в корені документа. Звичайно, існує маса рішень для цієї проблеми:

  • Я міг запустити git checkout -відразу після встановлення, щоб скинути власні файли
  • /buildНаприклад, я можу зберігати свої файли збирання у спеціальній папці
  • Я міг би скористатися іншим інструментом збирання, як-от Phing, Ant, або Rake (хоч мої розвідники не були б такі щасливі)
  • Я міг би замінити magento/magento2-baseспеціальний пакет із спеціальним відображенням основних файлів (не дуже оптимальним, але ей, це варіант)

Мені особисто не подобаються всі ці варіанти, тому я хотів би знати, чи є кращий або кращий спосіб досягти того, що я намагаюся зробити.

Хтось має таку ж проблему? Як ти це вирішив? Як ви структуруєте свій проект під VCS?

ОНОВЛЕННЯ

Додатковий пункт, пов’язаний із налаштуванням проекту. У своїх експериментах я помітив, що інсталятор композитора Magento має прапор для перекриття файлів:

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

Це внутрішньо трактується як булевий, якщо я не помиляюсь, тому я спробував налаштувати його falseна пропуск головного. Коли я запускаю, composer installустановка не вдається через наявність файлів (файлів). В основному, якщо я не дозволяю Magento змінювати свої файли, я не можу його встановити.

Яка мета цього прапора тоді? Хіба лише припустимо, щоб я перевірив? Мені немає сенсу бути чесним, але, можливо, хтось може пролити трохи світла на цю тему.


Мені цікаво бачити, що інші відповідають у якості відповіді. В ідеалі, я думаю, що ми хотіли б утримати Magento Core від нашої основної репо-версії і не обмежуватись лише шаблоном, який ми створюємо, та будь-якими користувацькими плагінами, які ми додаємо чи правильними. Тоді під час збирання ми посилаємось на core + наш проект репо і збираємо артефакт програми із сховищ. Це метод, який я нещодавно використовував для M1, і мені цікаво, чи офіційна рекомендація Magento зробити щось подібне з M2 тепер, коли композитор повністю підтримується.
Брайан 'BJ' Hoffpauir Jr.

У нових версіях M2, то Gruntfile.js, gulpfile.jsі package.jsonпроблема вирішена. Питання розглядається в цьому питанні по - , як і раніше належить до більш нової версії Magento 2 , коли вам потрібно змінити themes.js, index.phpабо .htaccess, наприклад.
оч.

Відповіді:


4

За короткий термін ми шукаємо окремі файли, які потребують налаштування. Наприклад, якщо людям потрібно змінити index.php, розробіть, як відокремити стандартний файл Magento від необхідних локальних налаштувань. Після досягнення цього можливо мати "єдиний справжній .gitignore для всіх проектів, які можна використовувати". Тобто, легко надати Git цілий каталог проектів.

Більш тривалий термін - мета максимально скоротити .гігнорувати. Наприклад, більше натисніть на модулі в каталозі "постачальник".

Потім

  1. Для всього, що ви не хочете ділитися між проектами, залиште це під додатком / кодом і виконайте це в основному репо-проекті.
  2. Все, що розробляється на місцевому рівні, ви хочете легше ділитися між проектами, помістіть в окремий репортаж GIT та встановіть через композитор, щоб він опинився під "постачальником". (Можливо, це місцевий композитор-репо або просто встановити прямо з GIT.)

Таким чином, ви все ще можете запустити ціле дерево проекту зверху вниз, захопивши файли composer.json і composer.lock (якщо тільки додаток / код не робиться). .Gitignore буде виключати каталог "постачальник" та інші файли, які не потрібні.

Це дає вам найкраще з обох світів, згаданих в іншій дискусії. Поточний біль - це тривалість і складність файлу .gitignore, і встановлення патчів наразі знищує деякі локальні налаштування (наприклад, в index.php). Короткострокове вирішення - видаліть index.php з .gitignore, а після встановлення виправлення перевірте, які зміни ви втратили (git diff) та повторно застосуйте їх вручну.


Гаразд, тож ви там найближчим часом поміняєте деякі речі, приємно! Цікаво, чи може цей "magento-force": "override"прапор якось корисним. Наразі це не зовсім те, що я очікував. Якщо ви редагували / розширювали ваші index.phpчи будь-які інші "основні" файли, ви можете просто сказати Magento не перезаписувати свої зміни. Чи має це сенс?
fmrng

3

Існує просте рішення для вашої проблеми перебору: не змінюйте основні файли;) Magento заснований на розширенні коду, а не на його зміні.

По-перше, ви не повинні поміщати всю папку додатків / кодів в одне сходове сховище. Кожен компонент Magento (Модуль, Тема тощо) повинен бути самим сховищем.

Якщо ви хочете змінити / розширити інтерфейс, вам слід створити нову тему і розглядати цю тему як ваш грубокопитний проект, а не весь екземпляр Magento2.

Щоб встановити тему у вашому проекті, ви можете легко перетягнути її через композитор безпосередньо зі свого сховища vcs


Ну, app/codeпапка спеціально є для налаштування Magento. Моє розуміння поточного M2 полягає в тому, що app/codeзамінює те, що app/code/localбуло в M1, і модулі спільноти можна встановити за допомогою композитора під vendor. У нас є декілька проектів з великою кількістю модулів, а також декількома темами. Те, що ви пропонуєте, було б неможливо керувати.
fmrng

Гей, ми управляємо проектами з> 100 компонентами таким чином. Ключовим моментом є збереження малих модулів та управління залежностями композитора між модулями. Ви можете клонувати сховище проекту magento для власних потреб та додати всі свої компоненти до свого проекту
Девід Верхолен

Якщо ви задоволені поточною установкою, це добре. Чесно кажучи, я вважаю це досить громіздким. Це означає, що у вас є 100+ сховищ git, і кожен раз, коли ви щось змінюєте, вам потрібно відкрити певний проект, здійснити зміни, запустити composer update. Де ти робиш своє composer.lockтоді? Якщо у вас над 10 проектом працює над одним проектом, це може вийти справді безладним. Звичайно, у нас є маса загальних модулів (і навіть тем), які ми встановлюємо за допомогою композитора, але для конкретності проекту для чіткості слід підходити під той же репо-код.
fmrng

Я не кажу, що ти робиш це неправильно, я думаю, що це трохи складніше на мій смак. Як цікаво, як ви перевіряєте історію репо з таким налаштуванням? Як ви можете використовувати такі функції, як git blameабо git logколи код розкиданий на кілька компонентів? Чи проводите ви інтеграційні тести, щоб побачити, що все працює нормально?
fmrng

ми обговорювали цю дискусію всередині минулого року, і розгортання стало досить простим, оскільки ми вирішили зробити його 1repo = 1module. Суть у тому, що ви не зробили б оновлення композитора за одну невелику зміну. Розробники працюють у розробницьких середовищах і безпосередньо там змінюють файли. Коли вони завершені, вони можуть позначити її як альфа, бета-версію або кандидата на випуск. Таким чином, декілька розробників можуть працювати над багатьма проектами одночасно, і наступного разу ви зробите оновлення композитора, яке ви залучите до всіх змін. Є чудові інструменти для організації ваших пакетів комп’ютерів та композиторів.
Сотні

2

Гаразд, схоже, що я знайшов кращого рішення для того, що намагався досягти. У розділі composer.jsonможна вказати, які файли слід ігнорувати програмою Magento Composer Installer. Якщо я не хочу, щоб мій Gruntfile.jsперебір був, я можу просто вказати його за допомогою наступної конфігурації:

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

Тепер я можу розширити стандартну установку, щоб відповідати моїм потребам.


Це рішення не здається "безпечним для оновлення". Якщо Magento внесе зміни до цих файлів, які ви проігноруєте, то ви не дізнаєтесь або забудете про ці файли. Ви використовуєте власну версію, яка ніколи не буде включати ці нові зміни. Будь ласка, перевірте мою відповідь на мою пропозицію.
оч.

2

На жаль, прийнята відповідь, хоча спочатку призначена для досягнення бажаної мети, працює лише для виключення файлів і каталогів, розміщених у корені, тому що якщо ми хочемо виключити файл, розміщений у підкаталозі (наприклад dev/tools/grunt/configs/themes.js, необхідний, якщо ми додамо нова тема і хочуть використовувати завдання Magento Grunt), вводячи її в конфігурацію "magento-opens-ignore", вона блокує розгортання всіх батьківських каталогів (тобто, розробника та всіх його підкаталогів).

Це трапляється тому, що метод, який обробляє "magento-opens-ignore" ( \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored), використовує strposдля узгодження цільового шляху зі списком виключених, тому кожен батьківський шлях завжди повертатиметься true.


Я знаю, я міг це бачити в своїх тестах, але оскільки ми використовуємо інший робочий процес збірки, він добре працює для нас. Не могли б ви знайти кращий варіант?
fmrng

Ми почали робити перевірку файлів під час фази збірки нашого конвеєра, потім перестали використовувати для всіх вбудованих завдань Grunt, так що атм це не проблема.
Дженнаро В’єтрі

До речі, ми почали оцінювати форк-магенто-композитор-інсталятор для покращення поведінки "magento -loy-ignore", якщо проблема з’явиться знову, ми могли піти цим шляхом
Gennaro Vietri

0

Використання патчів

Що я використовую - це створення та застосування патчів. Коли нам потрібно змінити dev/tools/grunt/configs/themes.js, index.phpабо .htaccessзастосуємо зміни до тимчасової копії файлу та створимо з нього виправлення ( build/спочатку створіть dir):

$ 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або updateдодавши команди te до scriptsрозділу вашого composer.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, щоб він був багаторазовим або виконуваним вручну)

Оновлення безпечно! : D

Це рішення безпечне оновлення! Ви не змінюєте основні файли безпосередньо, не поважаючи оригінальний файл. Ви застосовуєте виправлення до оригінального файлу Magento2. Коли цей файл змінюється через оновлення, патч вийде з ладу, і ви знаєте, що вам слід уважніше ознайомитися з новими змінами та створити новий патч.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.