Заставить Composer учитывать другие каталоги для пакетов, чтобы избежать дублирования.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Заставить Composer учитывать другие каталоги для пакетов, чтобы избежать дублирования.

Сообщение Anonymous »

Я пытаюсь объединить League/omnipay в набор плагинов таким образом, чтобы он был модульным. Итак, основной модуль проекта имеет этот композитор.json:

Код: Выделить всё

{
"require": {
"league/omnipay": "^3.2"
},
"config": {
"allow-plugins": {
"php-http/discovery": true
}
}
}
Все хорошо. Когда мне требуется или обновление композитора, он захватывает все зависимости и выгружает их в плагины/core_module/vendor/.
Далее я хочу собрать несколько сопутствующих плагинов, которые предлагают различные конкретные шлюзы: PayPal, Stripe, WorldPay. и т. д., чтобы пользователи могли выбирать, какие из них они хотят использовать на своем сайте.
Например, для PayPal требуется следующий композитор.json:

Код: Выделить всё

{
"require": {
"league/omnipay": "^3.2",
"omnipay/paypal": "^3.0"
}
}
Раздражает то, что он загружает кучу зависимостей в свой собственный каталог поставщика, который также включает те, которые уже загружены в основной модуль. Это дублирование, которого я не хочу.
Я хотел бы каким-то образом проинструктировать Composer (и, следовательно, мое PHP-приложение, когда ему нужно загрузить классы), что «библиотека League/omnipay находится там, приятель --->», чтобы он загружал/обновлял только те дополнительные материалы, которые ему нужны специально для интеграции PayPal. То же самое касается модулей Square, Stripe и т. д.
Я пробовал возиться с такими вещами:

Код: Выделить всё

...
"repositories": [
{
"type": "path",
"url": "../core_module/vendor/omnipay"
}
],
...
но он все равно загружает все дерево зависимостей в собственный каталог поставщика шлюза, поэтому я, вероятно, использую эту функцию неправильно.
После установки различные плагины располагаются рядом друг с другом:

Код: Выделить всё

plugins/core_module
plugins/gateway_paypal
plugins/gateway_stripe
plugins/...
так что относительные пути будут работать.
Как я могу указать Composer загружать/поддерживать только одну копию каждой зависимости и не дублировать копии в core_module?
Или, если это невозможно, какие еще варианты доступны? (символические ссылки могут работать, но мне нужно учитывать и пользователей Windows).
Одна вещь, которую я еще не пробовал, которая может работать в соответствии с другими темами SO, - это добавление этого в композитор.json каждого плагина шлюза:

Код: Выделить всё

{
"config": {
"vendor-dir": "../core_module/vendor/"
}
}
Теоретически, я подозреваю, что затем будут установлены зависимости в папку поставщика родственного каталога, которая затем может «увидеть», что там уже есть некоторые зависимости, и просто заполнить пробелы.
Моя единственная оговорка: этот подход не разделяет вещи, поэтому, если кто-то решит отказаться от PayPal и использовать Stripe в будущем, его распаковка будет более сложной и потенциально оставит мусор на диске. Если код шлюза PayPal и зависимости могут быть ограничены отдельной папкой шлюза_paypal, удаление представляет собой просто удаление всего каталога. Я бы предпочел это, чем загрязнять каталог поставщика core_module, если это возможно.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»