ChatGPT解决这个技术问题 Extra ChatGPT

如何正确要求 Composer 中的特定提交,以便它可用于依赖包?

我有一个库 foo/foo-lib,其中 requires 来自 GitHub 的特定提交:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

它工作正常:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

但是当我在其他项目中需要该库时:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

它产生依赖错误:

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

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

所以我的问题是:如何在我的库中正确地require从 GitHub 提交的特定提交,以便它可以在依赖包中使用?

请注意,当需要提交时,composer 不会遵守该提交要求(cmoposer.json)。相反,它计算会随时间变化的分支头需求。所以这可能会工作一段时间,但将来肯定会中断。

C
Chris

在您的库和应用程序中,您必须在该哈希处显式要求 Gaufrette 库,并带有 dev 标志。这样的东西应该在应用程序 composer.json 中起作用:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

the documentation

如果您的依赖项之一依赖于一个不稳定的包,您还需要显式地要求它,以及它的足够稳定性标志。

该文档还建议您需要在您的 bar/bar-app Composer 文件中包含 Gaufrette 存储库,尽管在这种情况下这听起来没有必要。我不确定为什么。


这个我已经试过了,也不行。我认为这可能与 Composer 更喜欢 Packagist 而不是 GitHub 有关吗?
不,我已经检查了我的本地存储库 - 这不是 GitHub 特定的问题。
我相当肯定我以前得到了这个工作。如果将 "minimum-stability": "dev" 添加到 bar/bar-app 要求会怎样?
looks like you're going to have to在您的库和您的应用程序中都明确要求该哈希值的 Gaufrette。 “如果您的依赖项之一依赖于不稳定的包,您还需要明确要求它,以及其足够的稳定性标志。”请注意,您可以有一些包,例如 Gaufrette,在 dev 稳定,其他一切默认为 stable
看起来 Composer 开箱即用地支持 GitHub - 我刚刚从第一个包中删除了 "url": "https://github.com/KnpLabs/Gaufrette.git",它仍然有效。
p
powpow12

以下是在命令行上执行此操作的方法:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

您不必使用整个散列,一个长七个字符的散列似乎可以解决问题。如上所述,您的项目将需要支持 dev - 如果尚未设置,它将抱怨。此外,使用 --with-dependencies 获取您正在更新的依赖项的任何依赖项。


刚试过这个,似乎不适用于 Composer 2。
...那么,如何将特定的哈希数与给定的补丁相关联。换句话说,我们如何知道补丁针对的是哪个提交?
如果我使用 composer require 而不是 composer update 似乎可以工作。
在 Composer 版本 2.1.6 上与 update 一起为我工作
G
Gayan Kalhara

如果您通过分叉对 Git 存储库进行更改,请确保您使用包名实际上是在包自己的 composer.json 文件中定义的 - 所以即使我将包分叉到我自己的 joshuapaling github 帐户,并且包现在位于 URL https://github.com/joshuapaling/Cake-Resque.git,从作曲家的角度来看,这根本不会影响包的名称。

一个愚蠢的错误 - 但我是作曲家的新手,一开始并不清楚!所以,我希望这可以帮助其他有同样问题的人。