Вопрос по composer php. Помогите

Привет всем. Знаю, что спрашиваю не на совсем профильном ресурсе. Но вдруг мне повезет. И мне подскажут ответ, над которым я бьюсь уже неделю.

Краткая предыстория вопроса. Все началось с того, что мы с другом изучали Laravel. И все шло хорошо, пока чей-то цепкий взгляд не заметил одну удивительную для нас штуку. Оказывается, не все зависимости, которые использует Laravel установлены в папку vendor пакетного менеджера composer. Я уже даже пожалел, что кто-то на совместных занятиях у нас такой зоркий.


Начали выяснять, как Laravel работает , если установлены не все зависимости. Выяснили что зависимости-то как раз есть все. Просто часть из них скрыта в исходном коде фреймворка под директивой "replace" composer.json схемы (ссылка -> https://getcomposer.org/doc/04-schema.md#replace ). Мы кое-как вникли в смысл этой директивы. Но остался небольшой нюанс.

Смысл директивы "replace", как мы ... эээ смогли понять. Разработчик продукта имеет право воспользоваться готовым пакетом не как зависимостью (через require), а скопировать  \ форкнуть код пакета напрямую в свой разрабатываемый код. Зачем так вообще делать - отдельный вопрос. Мы не особо понимаем. Но раз так делают, значит бывает нужно.


Директива "replace" приказывает пакетному менеджеру composer не выкачивать пакет из удаленного репозитория, а просто запоминает, что этот пакет уже выкачан самим разработчиком. Естественно, разработчик в своем коде должен предусмотреть не тупое копирование кода, а все-таки правильное подключение скопированного кода. Ну то есть, например, хотя бы подключить namespace скачанного пакета в автозагрузку.


Теперь сам вопрос. В директиве "replace" мы указываем название пакета, над которым перехватываем контроль вместо composer. Но также нужно указать версию заменяемого пакета. И практически везде вместе определенной версии стоит указание "self.version"

"replace": {

"illuminate/auth": "self.version",

...

}


Что означает такое ограничение версии как "self.version"? Как composer будет определять единственную конечную версию пакета, если какой-то 3-party пакет запросит тот же illuminate/auth, но вполне определенной версии (см пример ниже)?


3-party пакет разрабатываемого проекта, подключенный как обычная зависимость через require, внутри себя требует ...

"require": {

"illuminate/auth": "8.83.1",

...

}


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

Лига программистов

1.5K постов11.4K подписчиков

Добавить пост

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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