如何正确要求 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 中的特定提交,以便它可用于依赖包?的主要内容,如果未能解决你的问题,请参考以下文章