使用 PHP composer 克隆 git 存储库



我正在尝试使用作曲家从 github 自动克隆一个不在 packagist 中的 git 存储库,但它不起作用,我无法弄清楚我做错了什么。

我想我必须将其包含在"存储库"中,如下所示:

"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],

然后可能将其列在"要求"部分。它应该类似于此示例,但它不起作用。它只是给出这个错误:

您的要求无法解析为一组可安装的软件包。

有没有人尝试过做这样的事情?

该软件包实际上可以通过packagist获得。在这种情况下,您不需要自定义存储库定义。只需确保添加具有匹配版本约束的require(始终需要)。

通常,如果软件包在 packagist 上可用,请不要添加VCS 存储库。它只会减慢速度。


对于无法通过 packagist 获得的软件包,请使用 VCS(或 git)存储库,如您的问题所示。执行此操作时,请确保:

  • "存储库"字段在根 composer.json 中指定(这是一个仅限根的字段,来自所需包的存储库定义将被忽略)
  • 存储库定义指向有效的 VCS 存储库
  • 如果类型是"git"而不是"vcs"(如您的问题),请确保它实际上是一个 git 存储库
  • 您有相关包裹的require
  • require中的约束与 VCS 存储库提供的版本匹配。您可以使用composer show <packagename>查找可用版本。在这种情况下,~2.3将是一个不错的选择。
  • require中的名称与远程composer.json中的名称匹配。在这种情况下,它是gedmo/doctrine-extensions.

下面是通过 VCS 存储库安装相同软件包的示例composer.json

{
"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],
"require": {
"gedmo/doctrine-extensions": "~2.3"
}
}

VCS 存储库文档很好地解释了所有这些。


如果有 git(或其他 VCS)存储库具有可用的composer.json请不要使用"包"存储库。包存储库要求你在定义中提供所有元数据,并将完全忽略提供 dist 和源中存在的任何composer.json。它们还有其他限制,例如在大多数情况下不允许进行适当的更新。

避免包存储库(另请参阅文档)。

在 2013 年撰写本文时,这是一种方法。作曲家添加了对更好方法的支持:请参阅@igorw的答案

你有存储库吗?

Git,Mercurial和SVN由Composer支持。

您是否对存储库具有写入权限?

是的?

存储库是否有composer.json文件

如果您有存储库,则可以写入:添加composer.json文件,或修复现有文件,并且不要使用以下解决方案。

转到@igorw的答案

仅当您没有存储库或存储库
没有composer.json并且您无法添加它时才使用此选项

这将覆盖 Composer 可能从原始仓库的composer.json读取的所有内容,包括包的依赖项和自动加载。

使用package类型会将正确定义所有内容的负担转移到您身上。更简单的方法是在存储库中有一个composer.json文件,然后使用它。

此解决方案实际上仅适用于极少数情况,即您有一个无法更改的废弃 ZIP 下载,或者您只能读取但不再维护的存储库。

"repositories": [
{
"type":"package",
"package": {
"name": "l3pp4rd/doctrine-extensions",
"version":"master",
"source": {
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git",
"reference":"master"
}
}
}
],
"require": {
"l3pp4rd/doctrine-extensions": "master"
}

你可以像这样将 git repository 包含到 composer.json 中:

"repositories": [
{
"type": "package",
"package": {
"name": "example-package-name", //give package name to anything, must be unique
"version": "1.0",
"source": {
"url": "https://github.com/example-package-name.git", //git url
"type": "git",
"reference": "master" //git branch-name
}
}
}],
"require" : {
"example-package-name": "1.0"
}

我尝试加入这里提到的解决方案,因为需要列出一些要点。

  1. 正如@igorw的回答中提到的,在这种情况下,存储库的URL必须在composer.json文件中指定,但是由于在这两种情况下,composer.json都必须存在(与@Mike Graf的第二种方式不同),在Packagist上发布它并没有太大区别(此外,Github目前也提供包服务作为npm包),唯一的区别,而不是在注册后在packagist界面输入URL。

  2. 此外,它有一个缺点,即它不能依赖于使用此方法的外部库,因为递归存储库定义在 Composer 中不起作用。此外,由于它,它似乎有一个"错误",因为递归定义在依赖项中失败,在根中显式重新指定存储库似乎还不够,而且必须重新指定包中的所有依赖项。

带有作曲家文件(回答 十月 18 '12 在 15:13 igorw)

{
"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],
"require": {
"gedmo/doctrine-extensions": "~2.3"
}
}

没有作曲家文件(回答 1月 23 '13 在 17:28 迈克格拉夫)

"repositories": [
{
"type":"package",
"package": {
"name": "l3pp4rd/doctrine-extensions",
"version":"master",
"source": {
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git",
"reference":"master"
}
}
}
],
"require": {
"l3pp4rd/doctrine-extensions": "master"
}

只要告诉作曲家使用源代码(如果有):

composer update --prefer-source

或:

composer install --prefer-source

然后,您将获得作为克隆存储库而不是提取的压缩包的包,因此您可以进行一些更改并将其提交回去。当然,假设您具有对存储库的写入/推送权限,并且 Composer 知道项目的存储库。

免责声明:我想我可能会回答一些不同的问题,但这是我发现这个问题时正在寻找的,所以我希望它对其他人也有用。

如果 Composer 不知道项目的存储库在哪里,或者项目没有合适的 composer.json,情况会稍微复杂一些,但其他人已经回答了这样的场景。

我遇到以下错误:The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

如果要分叉另一个存储库以进行自己的更改,则最终将获得一个新的存储库。

例如:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

新的 url 需要进入 composer.json 的存储库部分。

请记住,如果要在需求部分中将分支引用为my-foo/bar,则必须在新存储库内的composer.json文件中重命名包。

{
"name":         "foo/bar",
=>
{
"name":         "my-foo/bar",

如果你刚刚分叉,最简单的方法是直接在 github 中编辑它。

就我而言,我使用 Symfony2.3.x,并且最小稳定性参数默认为"稳定"(这很好)。我想导入一个不在packagist中的存储库,但遇到了同样的问题"您的要求无法解析为一组可安装的软件包。 看来我尝试导入的存储库中的 composer.json 使用了最低稳定性的"dev"。

因此,要解决此问题,请不要忘记 验证minimum-stability。我通过要求一个dev-master版本而不是本文中所述的master来解决它。

如果你想使用GitHub上的composer.json,你可以看看这个例子(在VCS部分下)。

包部分适用于没有composer.json的包。但是,您也没有遵循该示例,否则它也会起作用。请阅读它对软件包存储库的看法:

基本上,您定义的信息包含在作曲家存储库的packages.json中,但仅适用于单个包。同样,最少的必填字段是名称、版本以及 dist 或 source。

https://stackoverflow.com/a/14485706/11716408

{
"repositories": [
{
"type":"package",
"package": {
"name": "tiagof2/materializecss-laravel-pagination",
"version":"v1.0.3",
"source": {
"url": "https://github.com/tiagofrancafernandes/materializecss-laravel-pagination.git",
"type": "git",
"reference":"v1.0.3"
}
}
}
],
"require": {
"tiagof2/materializecss-laravel-pagination": "v1.0.3"
},
}
composer update

相关内容

  • 没有找到相关文章

最新更新