【问题标题】:Composer: Where are Conflicts Between Repositories Settled in Composer's SourceComposer:在 Composer 的源中解决的存储库之间的冲突在哪里
【发布时间】:2016-08-08 01:59:04
【问题描述】:

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

但是,根据手册,它是possible to configure multiple repositories。

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

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

  1. 从 Packagist 下载
  2. 从 VCS 存储库下载
  3. 从自定义作曲家存储库下载

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    来自同一页面: 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;
    }
    

    总结:

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

    2. 在 repos 中查找包的顺序是它们在 composer.json 中定义

    3. 相同版本之间的分辨率是“第一胜”

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 1970-01-01
      • 2012-11-05
      • 2017-04-30
      • 2015-12-03
      • 2021-07-11
      • 1970-01-01
      • 2020-11-21
      • 2021-09-21
      相关资源
      最近更新 更多