来自同一页面:
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
它明确说明了与默认的 packagist.org 存储库相比首先检查了哪些自定义存储库。
另外 - 提供了一份详细指南,说明您需要做什么才能让 composer 加载您的版本而不是原始版本。
还基于提及 dev- 前缀,应将其置于版本约束中 - 作曲家最有可能比较 repos 并根据该特定 repo 中请求版本的可用性选择一个而不是另一个。
我肯定会说作曲家首先检查自定义存储库。
根据源代码检查,这些行说自定义存储库是按照定义的顺序进行检查的,默认存储库是最后一个:
这显示了自定义存储库是如何在默认配置中合并的:
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;
}
总结:
在调用require 命令时解析要安装的实际版本的输入点位于:
composer/src/Composer/Command/InitCommand.php
在determineRequirements()方法中,处理输入
在 repos 中查找包的顺序是它们在 composer.json 中定义
相同版本之间的分辨率是“第一胜”
如果配置了多个存储库并给出了特定约束,则遇到的第一个包含所需约束的存储库获胜。