php - Composer : Where are Conflicts Between Repositories Settled in Composer's Source

标签 php composer-php

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

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

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-前缀,应将其置于版本约束中 - Composer 最有可能比较存储库并根据该特定存储库中请求版本的可用性来选择一个存储库。

我肯定会说哪个 Composer 首先检查自定义存储库。

根据源代码检查,这些行表示按照定义存储库的顺序检查自定义存储库,默认存储库是最后一个:

这显示了自定义存储库如何合并到默认配置中:

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.phpdetermineRequirements()方法,处理输入

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

  3. 相同版本之间的解决方案是“先胜”

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

关于php - Composer : Where are Conflicts Between Repositories Settled in Composer's Source,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658262/

相关文章:

php - sql 选择当天发生的事情的地点

php - 如何将没有键的数组插入mysql?

laravel - 丙酮包装Laravel 5.1安装

php - 'composer' 不是内部或外部命令,也不是可运行的程序或批处理文件

php - Composer : Require a specific version of a non-required package

php - 我如何使用 php 将泰卢固语字符插入 mysql?

php - 当测试外部Mysql连接时,我得到CDbConnection failed to open the DB connection

php - 如何在使用 MySQL 的子查询中执行 LEFT JOIN 两个表并从主查询中排除多行?

php - Composer 安装 -sS 或 -s

php - 使用 Composer 的开发/生产切换时如何正确部署?