composer-php - 尝试包含多级公共(public)个人存储库时出现 Composer 错误

标签 composer-php

我正在拆分一些个人代码,以模块化并在不同的项目中重用它们。 我最近开始使用 Composer,并使用它在我的项目中引用这些模块。

到目前为止,以下内容对我有用:

First project composer.json

{
    "name": "mpf/apimodule",
    "version":"dev-main",
    "autoload": {
        "psr-4": {
            "APIModule\\":"classes/"
        }
    }
}
Second project composer.json

{
    "name": "mpf/crawler",
    "version":"dev-main",
    "autoload": {
        "psr-4": {
            "API\\": "classes/"
        }
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b2d5dbc6f2d5dbc6dac7d09cd1dddf" rel="noreferrer noopener nofollow">[email protected]</a>:{User}/{Repo}.git"
        }
    ],
    "require": {
        "fabpot/goutte": "^3.2",
        "mpf/apimodule": "dev-main"
    }
}

两位 Composer 都已编译,项目按预期工作。

但是当我尝试添加第三层时

Third project composer.json

{
    "autoload": {
        "psr-4": {
            "API\\": "classes/"
        }
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98fff1ecd8fff1ecf0edfab6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a>:{User}/{Repo}.git"
        }
    ],
    "require": {
        "mpf/crawler": "dev-main"
    }
}

运行 Composer 更新命令时出现以下错误

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires mpf/crawler dev-main -> satisfiable by mpf/crawler[dev-main].
    - mpf/crawler dev-main requires mpf/apimodule dev-main -> could not be found in any 
version, there may be a typo in the package name.

我发现了类似的问题,但我的存储库都是公共(public)的,这就是他们的问题。

我尝试运行composer -vvv/composerdiagnose,但在结果中找不到任何有用的信息。

最佳答案

根据问题中给出的描述,您将存储库添加到 root composer.json 文件中。只要您使用根 composer.json 文件,这种方法就可以正常工作。那具有这个文件的项目。

现在,虽然这适用于每个项目,但当您将第三个(或第四个、第五个等)composer.json 文件放入混合中时,或者按照您的说法 “添加第三层”,它停止工作。

从技术上讲,它不会停止工作,但是 Composer 无法再解析该继承的存储库来解析依赖关系:

- Root composer.json requires mpf/crawler dev-main \
    -> satisfiable by mpf/crawler[dev-main].
- mpf/crawler dev-main requires mpf/apimodule dev-main \
    -> could not be found in any version, there may be a typo in the package name.

尽管 Composer 很诚实,但您的情况可能会令人困惑。您当然已经仔细检查过没有拼写错误,但 Composer 仍然找不到任何版本。

这是因为 Composer 仅使用来自 root composer.jsoncomposer.json#/repositories 配置 - 即文件本身。让我们想象一下这一点:

composer.json
vendor/mpf/crawler/composer.json

我有根据的猜测是,尽管您已将 mpf/crawler 的存储库添加到 composer.json mpf/apimodule 的存储库> 尚未添加到其中,仅添加到 vendor/mpf/crawler/composer.json 中。

修复很简单,添加您的项目所需的所有存储库来解决项目的所有依赖关系配置文件(您安装依赖项的项目中的composer.json)。

如果你仔细思考一下,可能会更清楚为什么会这样:

composer.json安装时,所有存储库都应该已经定义,否则安装的结果将纯粹是运气游戏。软件包将能够覆盖您的存储库配置,您将不再受控制。

我对继续您的旅程的建议:

  1. 在您的root composer.json 文件中添加存储库,以确保您的项目配置完成。 (目标:了解配置、项目级别)
  2. 使用此方法时,请考虑您是否想要对存储库进行全局配置。也就是说,您可以在计算机用户级别配置跨项目(在该主机上)共享的存储库列表。 (目标:了解全局配置、主机级别、使用项目)
  3. 对 Composer 提供的不同类型的存储库进行 Safari 浏览(比较 with the documentation ),因为您可能会在其中找到更多内容(例如路径存储库、您可以共享的另一个中央 .json 文件等 - 有相当多的选项) 。 (目标:了解不同的存储库配置类型)

kuba 指向 Composer FAQ 中有关此主题的条目( via ):

关于composer-php - 尝试包含多级公共(public)个人存储库时出现 Composer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74765807/

相关文章:

symfony - composer.json 无法解析可安装的软件包集

php - 无法在 Symfony2 2.4 中安装 SonataUserBundle

php - pear 包未解决

php - 但这些与您的要求或最低稳定性相冲突

php - Composer 无法识别 PHP 7

php - PHP 8 开发中的 Laravel

testing - 使用 Composer 要求包含测试的包

api - 设置未知属性:yii\web\UrlRule::GET

php - 我应该用 GIT 发送我的 Composer 供应商目录吗

php - Symfony 安装缺少的供应商库