Композитор: Где конфликты между репозиториями, урегулированными в источнике Композитора

В PHP Composer, композитор по умолчанию проверяет packagist.org для расположения пакетов. Это хранилище композитора по умолчанию.

Однако, согласно инструкции, это можно настроить несколько репозиториев.

Как composer (т.е. когда он находится в исходном коде) разрешает конфликты между этими репозиториями.

то есть, если в вашем проекте настроены тип хранилища VCS и хранилище настраиваемого композитора, и у каждого из них был пакет с именем laravel/laravel, по каким правилам композитор будет следовать, решая, должен ли пакет

  1. Скачано с Packagist
  2. Скачано из хранилища VCS
  3. Загруженный из пользовательского хранилища композитора

1

Решение

с той же страницы:
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

в нем четко указано, какие пользовательские репозитории проверяются в первую очередь по сравнению с репозиторием по умолчанию packagist.org.

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

также основанный на упоминании dev- префикс, который должен быть установлен в ограничении версии — композитор, скорее всего, сравнивает репо и выбирает одно из другого, основываясь на наличии запрашиваемой версии в этом конкретном репо.

Я наверняка могу сказать, что композитор проверяет пользовательские репо в первую очередь.

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

это показывает, как пользовательские репозитории объединяются в конфигурации по умолчанию:

file: composer/src/Composer/Config.php

if (!empty($config['repositories']) && is_array($config['repositories'])) {
$this->repositories = array_reverse($this->repositories, true);
$newRepos = array_reverse($config['repositories'], true);
foreach ($newRepos as $name => $repository) {
// disable a repository by name
if (false === $repository) {
unset($this->repositories[$name]);
continue;
}
// disable a repository with an anonymous {"name": false} repo
if (is_array($repository) && 1 === count($repository) && false === current($repository)) {
unset($this->repositories[key($repository)]);
continue;
}
// store repo
if (is_int($name)) {
$this->repositories[] = $repository;
} else {
$this->repositories[$name] = $repository;
}
}
$this->repositories = array_reverse($this->repositories, true);
}

и это показывает, что репозитории запрашиваются в порядке, в котором они хранятся в памяти, пока не будет найден пакет:

file: composer/src/Composer/Repository/RepositoryManager.php

public function findPackage($name, $constraint)
{
foreach ($this->repositories as $repository) {
if ($package = $repository->findPackage($name, $constraint)) {
return $package;
}
}
return null;
}

В заключение:

  1. введите точку для определения актуальной версии для установки, когда вызывается require Команда находится по адресу:
    composer/src/Composer/Command/InitCommand.php
    в determineRequirements() метод, который обрабатывает ввод

  2. пакет просматривался в репозитории в порядке их определения в composer.json

  3. разрешение между одними и теми же версиями — «первые победы»

  4. если настроено несколько репозиториев и задано определенное ограничение, первый встреченный репозиторий, который содержит желаемое ограничение, выигрывает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]