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

Posted

技术标签:

【中文标题】如何正确要求 Composer 中的特定提交,以便它可用于依赖包?【英文标题】:How to correctly require a specific commit in Composer so that it would be available for dependent packages? 【发布时间】:2014-02-14 08:49:11 【问题描述】:

我有一个库 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)。相反,它计算会随时间变化的分支头需求。所以这可能会工作一段时间,但将来肯定会中断。​​ 【参考方案1】:

您必须在您的库和应用程序中明确要求该哈希处的 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",它仍然有效。【参考方案2】:

这是你在命令行上的操作方式:

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

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

【讨论】:

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

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

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

【讨论】:

以上是关于如何正确要求 Composer 中的特定提交,以便它可用于依赖包?的主要内容,如果未能解决你的问题,请参考以下文章

composer需要尚未合并到分支的特定git提交

你如何恢复到 Git 中的特定标签?

如何回滚 JDeveloper ADF 中的特定行?

如果填写了特定字段,如何在新选项卡中提交表单,否则正常提交?

Composer/Laravel:如何添加/更新特定的包

git版本控制文件提交到composer应用市场