作曲家:在作曲家的源代码中解决的存储库之间的冲突在哪里



在PHP Composer中,Composer默认检查packagist.org中的包位置。它是默认的composer存储库。

但是,根据手册,可以配置多个存储库。

composer(即在其源代码中)如何解决这些存储库之间的冲突。

也就是说,如果您的项目中同时配置了VCS存储库类型和自定义composer存储库,并且每个存储库都有一个名为laravel/laravel的包,那么composer在决定该包是否应该是时会遵循什么规则

  1. 从Packagist下载
  2. 从VCS存储库下载
  3. 从自定义composer存储库下载

来自同一页面:https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

它明确表示,与默认的packagist.org回购相比,首先检查的是哪些自定义回购。

此外,还提供了一个详细的指南,说明您需要做些什么才能使composer在原始版本上加载您的版本。

同样基于提及dev-前缀,该前缀应置于版本约束-最有可能比较repo并根据特定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;
}

结论:

  1. 当调用require命令时,用于解析要安装的实际版本的输入点位于:composer/src/Composer/Command/InitCommand.php在处理输入的determineRequirements()方法中

  2. 按照composer.json 中定义的顺序在repos中查找包

  3. 相同版本之间的分辨率是"先赢"

  4. 如果配置了多个存储库,并且给定了特定的约束,则遇到的第一个存储库(包含所需约束)将获胜。

相关内容

  • 没有找到相关文章

最新更新