Когда я начинаю новый проект M2, первое, что я хотел бы сделать, это установить ядро через composer:
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition
Теперь я могу написать свой пользовательский модуль (и) и тему (и) в app/code
. Затем я добавил бы мою composer.*
и всю app/code
папку в мою VCS. Пока все хорошо.
Предположим, теперь я хочу использовать некоторые инструменты сборки для своего проекта, скажем, Grunt или Gulp.
Если я сделаю свой собственный
Gruntfile.js
,magento/magento2-base
пакет будет перезаписан при запускеcomposer install
после клонирования репозитория.Если я зафиксирую свой
gulpfile.js
, я не смогу определить свои зависимости в apackage.json
, потому что он также будет перезаписанmagento/magento2-base
.Если я решу использовать установку Grunt в Magento и захочу изменить ее, отредактировав файлы в
/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 переопределить мои файлы, я не смогу установить его.
Какова цель этого флага тогда? Это только для проверки? Честно говоря, для меня нет особого смысла, но, возможно, кто-то может пролить свет на эту тему.
Gruntfile.js
,gulpfile.js
иpackage.json
проблема решена. Вопрос рассматривается в этом вопросе по - прежнему относится к более новой версии Magento 2 , когда вам нужно изменитьthemes.js
,index.php
или.htaccess
, например.Ответы:
В краткосрочной перспективе мы ищем отдельные файлы, которые нуждаются в настройке. Например, если людям нужно изменить index.php, подумайте, как отделить стандартный файл, поставляемый Magento, от необходимости локальной настройки. Достигнув этого, можно получить «один настоящий .gitignore для всех проектов». То есть, легко зафиксировать весь каталог проекта в Git с помощью .gitignore всего, что «выбор компоновщика» выберет для вас (и все, что «обновление композитора» заменит при установке патча или обновления).
В долгосрочной перспективе цель состоит в том, чтобы максимально сократить .gitignore. Например, добавьте больше в модули в каталоге vendor.
потом
Таким образом, вы все еще можете git фиксировать все дерево проекта сверху вниз, захватывая файлы composer.json и composer.lock (фиксация только app / code - нет). .Gitignore исключит каталог vendor и другие ненужные файлы.
Это дает вам лучшее из обоих миров, упомянутых в другом обсуждении. В настоящее время проблема заключается в длине и сложности файла .gitignore, и установка патча в настоящее время уничтожает некоторые локальные настройки (например, в index.php). Краткосрочный обходной путь - удалите index.php из .gitignore, и при установке исправления проверьте, какие изменения вы потеряли (git diff), и повторно примените их вручную.
источник
"magento-force": "override"
флаг быть полезным как-нибудь? На данный момент это не совсем то, что я ожидал. В случае, если вы отредактировали / расширили своиindex.php
или любые другие «основные» файлы, вы можете просто сказать Magento не перезаписывать ваши изменения. Есть ли смысл?Существует простое решение для вашей проблемы переопределения: не меняйте основные файлы;) Magento основан на расширении кода, а не на его изменении.
Во-первых, вы не должны помещать всю папку приложения / кода в один репозиторий vcs. Каждый компонент Magento (модуль, тема и т. Д.) Должен быть сам репозиторий.
Если вы хотите изменить / расширить внешний интерфейс, вы должны создать новую тему и рассматривать эту тему как свой основной проект, а не весь экземпляр Magento2.
Чтобы установить свою тему в свой проект, вы можете легко загрузить ее через композитор прямо из вашего хранилища vcs.
источник
app/code
папка специально там для настройки Magento. Мое понимание текущего M2 - то, чтоapp/code
заменяет то, чтоapp/code/local
было в M1, и модули сообщества могут быть установлены через composervendor
. У нас есть несколько проектов с БОЛЬШИМ количеством модулей, а также несколько тем. То, что вы предлагаете, было бы невозможно.composer update
. Где вы делаетеcomposer.lock
то? Если у вас есть 10+ разработчиков, работающих над одним и тем же проектом, он может оказаться очень грязным. Конечно, у нас есть много общих модулей (и даже тем), которые мы устанавливаем через composer, но для ясности код для конкретного проекта должен быть версионирован в том же репо.git blame
илиgit log
когда код разбросан по нескольким компонентам? Вы запускаете интеграционные тесты, чтобы увидеть, что все работает нормально?Хорошо, похоже, я нашел лучшее решение для того, чего я пытался достичь. В этом разделе
composer.json
можно указать, какие файлы следует игнорировать установщиком Magento Composer. Если я не хочу, чтобы мойGruntfile.js
был переопределен, я могу просто указать его в следующей конфигурации:Теперь я могу расширить стандартную установку в соответствии со своими потребностями.
источник
К сожалению, принятый ответ, хотя изначально и предназначен для достижения желаемой цели, работает только для исключения файлов и каталогов, помещенных в корень, потому что, если мы хотим исключить файл, помещенный в подкаталог (например,
dev/tools/grunt/configs/themes.js
, требуется, если мы добавим новая тема и хотите использовать задачи Magento Grunt), поместив ее в конфигурацию «magento-deploy-ignore», он блокирует развертывание всех родительских каталогов (то есть dev и всех его подкаталогов).Это происходит потому, что метод, который обрабатывает magento-deploy-ignore (
\MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored
), используетstrpos
для сопоставления пути назначения со списком исключенных, поэтому каждый родительский путь всегда будет возвращать true.источник
Использование патчей
Я использую создание и применение патчей. Когда нам нужно изменить
dev/tools/grunt/configs/themes.js
,index.php
или.htaccess
применить изменения во временную копию файла и создать патч из него (создатьbuild/
реж первый):Затем мы можем сделать так, чтобы этот патч применялся автоматически при запуске
composer install
илиupdate
добавляя команды te вscripts
раздел вашегоcomposer.json
файла:(Также вы можете поместить вышеуказанную
patch ...
команду в скрипт bash, скажем,build/themes_patch.sh
и вызвать этот скрипт из Composer, чтобы он мог использоваться повторно или выполнялся вручную)Обновление безопасно! : D
Это решение безопасно для обновления! Вы не изменяете основные файлы напрямую, не уважая исходный файл. Вы применяете патч к исходному файлу Magento2. Когда этот файл изменяется из-за обновления, патч не работает, и вы знаете, что вам нужно внимательно посмотреть на новые изменения и создать новый патч.
источник