В документации Composer приводятся два основных примера. Я попытаюсь объяснить:
Перечисляет пакеты, заменяемые этим пакетом. Это позволяет вам разблокировать пакет, публиковать его под другим именем со своими номерами версий, тогда как пакеты, требующие первоначального пакета, продолжают работать с вашей вилкой, потому что он заменяет исходный пакет.
Предположим, что ваша программа использует original/library
и other/package
, что само по себе требует также original/library
.
Теперь вы считаете, что original/library
необходимо интегрировать функцию, но сопровождающие не допустит, чтобы ваше предложение произошло в их пакете. Вы решили разветвить эту библиотеку под именем better/library
и пометить новую версию.
Обратно к вашему программному обеспечению. Конечно, он должен начать использовать better/library
, поэтому вам нужно это вместо этого, но для этого other/package
по-прежнему требуется original/library
- копирование кода! Как вы можете сделать этот другой пакет для использования своего better/library
вместо этого, не разрывая его и меняя только композитор.json (вы все еще совместимы с этим original/library
, так что он должен работать)?
Добавляется ключ заменить на ваш composer.json
:
"replace": {
"original/library":"1.*"
}
Теперь композитор знает, что любой пакет с вашего better/library
одинаково хорошо, как original/library
, когда речь идет о разрешении зависимостей в other/package
.
Это также полезно для пакетов, содержащих подпакеты, например, основной пакет symfony/symfony содержит все компоненты Symfony, которые также доступны в виде отдельных пакетов. Если вам нужен основной пакет, он автоматически выполнит любые требования к одному из отдельных компонентов, поскольку он их заменяет.
Те же правила, несколько иной угол. Но если вам требуется полная структура в вашем программном обеспечении и другая библиотека, которая впоследствии также требует компонент этой структуры, объявление этой структуры replace
позволяет Composer не устанавливать этот единственный компонент дважды, потому что он уже включен в полная структура.
Я думаю, что почти получилось. Так что я не понял, как композитор знает, что заменить (пакет a с b или пакетом c с d), но композитор смотрит на имя класса, чтобы сравнить его, правильно? Таким образом, любой пакет с именем a/b заменяется на x/b или y/b. И добавление self.version, вероятно, означает замену только тогда, когда номера версий равны. – Ilyes512
Композитор проверяет имена пакетов только в соответствующих файлах 'composer.json'. Он не проверяет имена классов. Чтобы этот трюк полностью работал, вы должны обеспечить совместимость в своем пакете, который заменяет другой пакет (случай 1). Композитор по-прежнему будет заменять ваш 'better/library' на' original/library', но если в оригинале есть классы, которые не имеют рабочего эквивалента в лучшей версии, код будет терпеть неудачу. – Sven