Как композитор обрабатывает несколько версий одного и того же пакета?

Это может (должно быть) спросить где-нибудь, но я не могу найти ответ. Если кто-то предоставит ссылку, я могу удалить этот пост!:

Просто пытаясь окунуться в какой-нибудь композитор (возможно, относится и к другим менеджерам пакетов).

В основном я просто хочу знать, что делает композитор в следующих сценариях:

1.

Мой основной проект имеет зависимость:

"guzzlehttp/guzzle": "5.0.*",

Мой внешний пакет имеет зависимость от

"guzzlehttp/guzzle": "5.0.*",

Создает ли композитор guzzlehttp/guzzle один раз, потому что он знает, что ему это нужно только один раз?

2. Тот же сценарий, но в будущем, если кто-то обновит основной проект:

"guzzlehttp/guzzle": "6.0.*",

Теперь композитор установит 2 версии guzzle (5 и 6) (я полагаю, что это то, что он должен делать), или он будет принимать самую высокую версию (т.е. 6)? Также, если есть 2 версии, это вызовет конфликты, потому что пространства имен могут быть одинаковыми?

Спасибо

Ответ 1

К вопросу 1

Да Composer может устанавливать только одну версию каждого расширения/пакета.

К вопросу 2

Из-за ответа 1: Композитор рассмотрит ваш основной проект и внешний пакет как несовместимые.

В этом случае вы могли бы

  • Оставайтесь с версией 5 в своем основном проекте.
  • попросите владельца внешнего пакета обновиться до версии 6, если он совместим с.
  • открыть внешний пакет и сделать его совместимым с версией 6.

Ответ 2

Сегодня у нас была ситуация, когда мы использовали несколько библиотек, одна из которых использовала Guzzle v5, а другая - Guzzle v6. Обновление (или понижение) не было приемлемым вариантом, так как это был сторонний код, поэтому мы должны были иметь возможность установить обе версии Guzzle.

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

Хитрость в том, что вам нужно переименовать пространство одной из двух версий. В нашем случае мы решили изменить v6 на GuzzleHttp6. Вот как это сделать:

  1. Убедитесь, что в вашем composer.json v6 включена:

"require": {
        "guzzlehttp/guzzle": "^6.2"
        // possible other stuff
    },