使用PHP Composer克隆Git仓库

142
我正在尝试使用composer自动从GitHub克隆一个不在packagist上的Git存储库,但它无法正常工作,我无法弄清楚我做错了什么。
我认为我必须将其包含在“repositories”中,如下所示:
"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

然后可能将其列在“require”部分中。它应该类似于this example,但它不起作用。它只会给出以下错误消息:
“您的要求无法解析为可安装的软件包集。”
有人尝试过像这样做吗?
9个回答

161

实际上,该包在 Packagist 上可用。在这种情况下,您不需要自定义存储库定义。只需确保添加一个匹配版本约束的 require(始终需要)。

通常情况下,如果一个包在 Packagist 上可用,不要 添加 VCS 存储库。它只会减慢速度。


对于不在 Packagist 上可用的包,使用VCS (或 git)存储库,如您的问题所示。这样做时,请确保:

  • 在根 composer.json 中指定 "repositories" 字段(它是仅限根的字段,将忽略所需软件包中的存储库定义)
  • 存储库定义指向有效的 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 repo docs很好地解释了这一切。


如果有一个带有composer.json的git(或其他VCS)存储库可用,则不要使用“package”存储库。包存储库需要您在定义中提供所有元数据,而将完全忽略所提供的分发和源中存在的任何composer.json。它们还具有其他限制,例如在大多数情况下不允许进行适当的更新。

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


1
哦,谢谢!我没找到它,因为我以为它会被称为 git 存储库 DoctrineExtensions。 - martin
3
始终查看composer.json中给出的名称。 - igorw
17
为什么这个回答被标记为正确答案?它确实解决了OP的问题,但是Clarence和Mike Graf给出了更一般性的解决方案。寻找包含非packagist项目的人很可能不想包含DoctrineExtensions。 - aefxx
2
@aefxx 我的回答实际上也解释了一般性问题,即必须指定“require”字段。 - igorw
6
“VCS存储库文档很好地解释了所有这些。” - hek2mgl
显示剩余6条评论

137

在2013年的写作时,这是一种可行的方法。Composer已经添加了对更好方法的支持:请参见@igorw的答案

你有代码库吗?

Composer支持Git、Mercurial和SVN。

你对代码库有写入权限吗?

有?

代码库是否有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"
}

7
用软件包仓库替换版本控制仓库是个不好的想法。目标仓库已经有 composer.json,所以应该使用版本控制仓库。你的示例还破坏了自动加载并忽略了 branch-alias - igorw
6
存储库页面 中所解释的,一个包存储库必须包含所有信息。如果不添加 autoload 字段,则不会被包括在内。基本上,您需要将 composer.json 中的所有信息复制粘贴到存储库定义中。VCS 存储库会直接从 VCS 中获取该信息。branch-alias 的好处在 别名文档我写的博客文章中有解释。 - igorw
2
为什么这个还在被赞同?Composer文档甚至明确说明(http://getcomposer.org/doc/05-repositories.md#package-2)应该避免使用包仓库。请停止鼓励不良实践。 - igorw
1
那你建议我改成什么呢? - Mike Graf
1
我想指出,我发现这篇文章及其评论很有价值,因为它强调了一种不良实践,而我很容易就会陷入其中。 - eddiemoya
显示剩余8条评论

54

您可以像这样将git仓库添加到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
如上面其他答案所解释的那样:如果您有一个代码库,请尽可能添加一个 composer.json 文件。 - Sven
@Sven ...因为否则无法指定特定的提交? - Cees Timmerman
谢谢您的分享,省去了我几个小时的时间 :) - metamaker
1
这是经过调整的通用版本,但基本上是Mike Graf答案的简单复制,因此我不确定通用是否比在问题中看到特定库作为示例更好。 - FantomX1

11

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

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

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

使用composer文件(由igorw于2012年10月18日15:13回答)

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

没有composer文件(回答者Mike Graf于2013年1月23日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"
}

8
只需告诉composer使用可用的源代码即可:
composer update --prefer-source

或者:

composer install --prefer-source

那么您将得到克隆存储库作为包,而不是提取的tarballs,因此您可以进行一些更改并将其提交回去。当然,假设您有对存储库的写入/推送权限,并且Composer知道项目的存储库。
声明:我认为我的答案可能与问题略有不同,但这正是我在找到这个问题时想要的,所以我希望它也对其他人有用。
如果Composer不知道项目的存储库在哪里,或者项目没有适当的composer.json,则情况会更加复杂,但其他人已经回答了这样的场景。

4

我遇到了以下错误:请求的包my-foo/bar在任何版本中都找不到,可能是包名称有误。

如果您要复制另一个存储库以进行自己的更改,则会得到一个新的存储库。

例如:

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

新的URL需要添加到composer.json的repositories部分中。
请记住,如果您想在require部分中引用您的fork为“my-foo/bar”,则需要在新存储库的composer.json文件中重命名包。
{
    "name":         "foo/bar",

=>

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

如果您刚刚fork了这个项目,最简单的方法是直接在Github上进行编辑。

请注意,软件包名称并不反映您可以阅读存储库的URL!两者之间没有自动链接,两者都可以独立选择。关于Composer唯一相关的信息是写入composer.json内的name属性中的名称。 - Sven

2
在我的情况下,我使用的是Symfony2.3.x,并且最小稳定性参数默认为“stable”(这很好)。我想导入一个不在packagist中的repo,但遇到了相同的问题“您的要求无法解析为可安装的软件包集。”。原来我尝试导入的repo中的composer.json使用了最小稳定性“dev”。
因此,要解决此问题,请勿忘记验证minimum-stability。我通过要求“dev-master”版本而不是“master”来解决它,如此post所述。

5
我也遇到了相同的问题,这个问题在这里有讨论。如果你有明确的引用(比如git提交),似乎可以像这样做:"dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e" - Blaskovicz

1

如果您想使用来自GitHub的composer.json,您可以查看this example(在VCS部分下)。

包部分是用于没有composer.json的包。但是,您也没有遵循该示例,否则它也可以工作。请阅读有关软件包存储库的说明:

基本上,您定义与composer存储库的packages.json中包含的相同信息,但仅针对单个软件包。再次强调,最少需要的字段是名称、版本和dist或source之一。


-1

https://dev59.com/k2cs5IYBdhLWcg3wTyRl#14485706

{
    "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

你为什么复制/粘贴了被接受的答案? - undefined
我没有做这个。这是创建软件包的标准流程。 这是一个软件包的composer.json文件,你可以自己看看。 - undefined
好的,抱歉,我以为这是与被接受的答案相同的代码,只是晚了9年。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接