使用PHP composer克隆git repo

时间:2012-10-18 11:56:48

标签: php composer-php packagist

我正在尝试使用composer从github中自动克隆一个不在packagist中的git存储库,但它不能正常工作,我无法弄清楚我做错了什么。< / p>

我认为我必须将其包含在“存储库”中,如下所示:

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

然后可能在“require”部分列出它。它应该类似于this example但它不起作用。它只是给出了这个错误:

  

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

有人试图做过这样的事吗?

8 个答案:

答案 0 :(得分:122)

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

通常,如果包装在包装上可用,添加VCS回购。它会减慢速度。


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

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

以下是通过VCS repo安装相同软件包的示例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 repos要求您在定义中提供所有元数据,将完全忽略提供的dist和source中存在的任何composer.json。它们还有其他限制,例如在大多数情况下不允许正确更新。

避免包裹回购(see also the docs)。

答案 1 :(得分:94)

在2013年撰写本文时,这是一种方法。 Composer增加了对更好方法的支持:请参阅@igorw的answer

你有存储吗?

Git,Mercurial和SVN受Composer支持。

您是否已写入存储区?

存储库是否有composer.json个文件

如果您有一个存储库,您可以写信:添加composer.json文件,或修复现有文件,不要使用下面的解决方案。

转到@igorw的answer

仅在您没有存储的情况下使用
或者如果存储库没有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"
}

答案 2 :(得分:40)

您可以将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"
}

答案 3 :(得分:3)

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

如果您要求另一个仓库进行自己的更改,最终会得到一个新的存储库。

E.g:

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

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

请记住,如果您想在您的需求部分中将您的分支称为my-foo/bar,则必须在新代理商的composer.json文件中重命名该分发包。

{
    "name":         "foo/bar",

=>

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

如果您只是分叉最简单的方法,请在github内编辑它。

答案 4 :(得分:3)

告诉作曲家使用音源:

composer update --prefer-source

或者:

composer install --prefer-source

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

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

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

答案 5 :(得分:2)

就我而言,我使用Symfony2.3.​​x并且最小稳定性参数默认为“稳定”(这很好)。我想导入一个不在packagist中的repo但是有同样的问题“你的需求无法解析为一组可安装的软件包。” 似乎我尝试导入的repo中的composer.json使用了最小稳定性“dev”。

因此,要解决此问题,请不要忘记验证minimum-stability。我通过要求dev-master版而不是master来解决此问题,如post中所述。

答案 6 :(得分:1)

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

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

  

基本上,您定义了编辑器存储库packages.json中包含的相同信息,但仅限于单个包。同样,所需的最小字段是名称,版本以及dist或source。

答案 7 :(得分:0)

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

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

  2. 此外,它有一个缺点,即它不能依赖使用此方法的外部库,因为递归存储库定义在Composer中不起作用。此外,由于它,似乎有一个“ bug”,因为递归定义在依赖项上失败,因此在根目录中明确地重新指定存储库似乎还不够,但是包中的所有依赖项也必须重新指定。

使用作曲家文件(在2012年10月18日,igorw回答15:13)

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

没有作曲家文件(13年1月23日在17:28 Mike Graf回答)

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