У меня есть проект, который использует другой мой проект GitHub в качестве зависимости. У меня есть два требования к конфигурации Composer для этой зависимости:
- Когда я работаю локально, мне нужна символическая ссылка от
composer install --prefer-source
до на мою локальную копию зависимости , чтобы я мог запускать git
команды внутри зависимости.
- Когда мой процесс сборки запущен, мне нужно
composer install --prefer-dist
для установки напрямую из репозитория GitHub без символьных ссылок.
Ранее я использовал следующее внутри composer.json
, чтобы выполнить первое требование:
"require": {
"narthur/natlib": "@dev"
},
"repositories": [
{
"type": "path",
"url": "../natlib",
"options": {
"symlink": true
}
}
]
После некоторой работы, я придумал это, которому удается удовлетворить второе требование:
"require": {
"narthur/natlib": "@dev"
},
"repositories": [
{
"type": "package",
"package": {
"name": "narthur/natlib",
"version": "2019.06.20",
"dist": {
"type": "zip",
"url": "https://github.com/narthur/natlib/archive/master.zip"
},
"source": {
"type": "path",
"url": "../natlib",
"reference": "master",
"options": {
"symlink": true
}
}
}
}
]
Это отлично работает в CI. Но когда я удаляю свой локальный файл vendor/
dir и composer.lock
и запускаю composer install --prefer-source
, я получаю следующее исключение:
[LogicException]
Загрузчик "Composer \ Downloader \ PathDownloader" является загрузчиком типа dist и не может использоваться для загрузки исходного кода пакета narthur / natlib-2019.06.20.0
Я попытался разделить их на две записи в репозитории, например:
{
"type": "path",
"url": "../natlib",
"options": {
"symlink": true
}
},
{
"type": "package",
"package": {
"name": "narthur/natlib",
"version": "2019.06.20",
"dist": {
"type": "zip",
"url": "https://github.com/narthur/natlib/archive/master.zip"
}
}
}
Это работает локально, символизирует зависимость, но завершается ошибкой в CI, , потому что Composer останавливается на первой соответствующей записи репозитория :
Здесь важен порядок. При поиске пакета Composer будет искать от первого до последнего хранилища и выбирать первое совпадение.
Как настроить Composer так, чтобы он вел себя так, как я хочу, чтобы локально флаг --prefer-source
символически связывал зависимость, а в CI флаг --prefer-dist
будет извлекать хранилище?
Информация, которую я нашел: