2013-09-18 4 views
28

Как работает «replace» с composer? Я прочитал документ композитора, но все еще не понимаю. Поиск дополнительной информации не ответил на мои вопросы.Как работает «замена» с композитором?

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

ответ

50

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

+0

Я думаю, что почти получилось. Так что я не понял, как композитор знает, что заменить (пакет a с b или пакетом c с d), но композитор смотрит на имя класса, чтобы сравнить его, правильно? Таким образом, любой пакет с именем a/b заменяется на x/b или y/b. И добавление self.version, вероятно, означает замену только тогда, когда номера версий равны. – Ilyes512

+0

Композитор проверяет имена пакетов только в соответствующих файлах 'composer.json'. Он не проверяет имена классов. Чтобы этот трюк полностью работал, вы должны обеспечить совместимость в своем пакете, который заменяет другой пакет (случай 1). Композитор по-прежнему будет заменять ваш 'better/library' на' original/library', но если в оригинале есть классы, которые не имеют рабочего эквивалента в лучшей версии, код будет терпеть неудачу. – Sven

0

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

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

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

Это объясняется более подробно здесь: How does the “replace” property work in Composer?

Смежные вопросы