Как свойство "replace" работает с composer?

Так как "заменить" свойство работы с композитор? Я прочитал документ композитора, но все еще не понимаю его. Поиск дополнительной информации не ответил на мои вопросы.

когда я смотрю на композитора.файл JSON на Laravel / Framework на github. Я не вижу, как будет работать замена. Может кто-нибудь объяснить мне, как это работает? А какая переменная "я".версия" будет равна?

2 ответов


документация композитора дает два основных примера. Я постараюсь объяснить:

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

предположим, что ваше программное обеспечение использует 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 не устанавливать этот единственный компонент дважды, потому что он уже включен в полную фреймворк.


когда вы создаете свой собственный пакет, вы определяете в своем composer.json какие пакеты это provide который в основном говорит композитор что пакет уже установлен, поэтому нет необходимости устанавливать его снова.

если вы используете replace свойства, он сообщает Composer, что ваш пакет хочет заменить исходный пакет вашей собственной вилкой, поэтому другим пакетам не нужно его устанавливать.

например, если a/a пакет требует b/b а ты скажи заменить b/b, он не будет загружен на Composer install/update.

это объясняется более подробно здесь: как свойство "replace" работает в Composer?