Spec-Zone.ru › Composer

Разрешение конфликтов слияния

При совместной работе над одним проектом Composer, вы неизбежно столкнетесь со сценарием, когда несколько человек добавляли, обновляли или удаляли что-то в файлах composer.json и composer.lock в нескольких ветках. При последующем слиянии этих веток появятся конфликты слияния. Разрешение этих конфликтов не так просто, как в отношении других файлов, особенно в отношении файла composer.lock.

Примечание: Возможно, не сразу понятно, почему текстовое слияние невозможно для файлов блокировки, поэтому рассмотрим следующий пример, где мы хотим слить две ветки;

  • Ветка 1 добавила пакет A, который требует пакет B. Пакет B заблокирован на версии 1.0.0.
  • Ветка 2 добавила пакет C, который конфликтует со всеми версиями пакета B ниже 1.2.0.

Текстовое слияние привело бы к версии пакета A 1.0.0, версии пакета B 1.0.0 и версии пакета C 1.0.0. Это недопустимый результат, так как конфликт пакета C не был учтён и потребовал бы обновления пакета B.

1. Повторное применение изменений

Наиболее безопасный метод слияния файлов Composer — принять версию из одной ветки и применить изменения из другой ветки.

Пример, где у нас две ветки:

  1. Пакет 'A' был добавлен
  2. Пакет 'B' был удалён, и добавлен пакет 'C'.

Для разрешения конфликта при слиянии этих двух веток:

  • Выберите ветку с наибольшим количеством изменений и примите файлы composer.json и composer.lock из этой ветки. В данном случае мы выбираем файлы Composer из ветки 2.
  • Повторите применение изменений из другой ветки (ветки 1). В этом случае нам нужно снова выполнить composer require package/A.

2. Проверка объединённых файлов

Перед сохранением убедитесь, что результирующие файлы composer.json и composer.lock действительны. Для этого выполните следующие команды:

php composer.phar validate
php composer.phar install [--dry-run]

Автоматизация разрешения конфликтов слияния с помощью git

Можно улучшить разрешение конфликтов слияния в git, используя пользовательский драйвер слияния git.

Пример этого можно найти на сайте драйвера слияния composer git от balbuf.

Важные моменты

Помните, что при возникновении конфликтов слияния в файле блокировки информация о точной версии новых пакетов, на которых была заблокирована одна из веток, теряется. Если пакет A в ветке 1 ограничен как ^1.2.0 и заблокирован как 1.2.0, он может быть обновлён при использовании ветки 2 в качестве базовой и выполнении новой composer require package/A:^1.2.0, так как это будет использовать последнюю доступную версию, разрешённую ограничением. Возможно, сейчас доступна версия 1.3.0 для этого пакета, которая теперь будет использоваться.

Выбор правильных ограничений версий и обеспечение соответствия пакетов семантическому определению версий при использовании операторов следующих значимых версий должно гарантировать, что слияние веток не сломает ничего из-за случайного обновления зависимости.

© Nils Adermann, Jordi Boggiano
Licensed under the MIT License.
https://getcomposer.org/doc/articles/resolving-merge-conflicts.md

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API