使用PHPcomposer php克隆git回购

我试图用composer从github中自动克隆一个不在packagist但是不能工作的github的git仓库,我不知道我在做什么错误。

我想我必须把它包含在“知识库”中,像这样:

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

然后可能列在“要求”部分。 它应该类似于这个例子,但它不起作用。 它只是给这个错误:

您的需求无法parsing为可安装的一组软件包。

有没有人试图做这样的事情呢?

在2013年写作时,这是一个办法。 composer php已经增加了对更好的方法的支持:请参阅@igorw的答案

你有存货吗?

Git,Mercurial,SVN由Composer支持。

你有写访问存储的权限吗?

是?

仓库是否有composer.json文件

如果你有一个仓库,你可以写:添加一个composer.json文件,或修复现有的文件,不要使用下面的解决scheme。

去@igorw的答案

只有在没有存货的情况下才使用
或者如果存储库没有composer.json ,并且您不能添加它

这将覆盖Composer可以从原始存储库的composer.json读取的所有内容,包括程序包的依赖关系和自动加载。

使用packagetypes会将正确定义所有内容的负担转移给您。 更简单的方法是在存储库中有一个composer.json文件,并使用它。

这种解决scheme只适用于极less数情况,在这种情况下,您无法更改已放弃的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" } 

这个包实际上可以通过packagist获得 。 在这种情况下,您不需要定制存储库定义。 只要确保你添加一个require (这是总是需要的)与一个匹配的版本约束。

一般来说,如果软件包上有软件包, 请不要添加VCS软件仓库。 它只会减慢速度。


对于通过packagist不可用的软件包,请使用VCS (或git)存储库,如问题所示。 当你这样做时,确保:

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

以下是一个样本composer.json ,通过VCS回购安装相同的包:

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

VCS回购文档很好地解释了这一切。


如果有可用的composer.json的git(或其他VCS)存储库, 请勿使用“包”回购。 包回购要求您提供定义中的所有元数据,并完全忽略提供的dist和source中的任何composer.json 。 它们也有其他限制,例如在大多数情况下不允许正确更新。

避免软件包回购( 另见文档 )。

你可以像这样将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" } 

只要告诉composer php如果可用就使用源代码:

 composer update --prefer-source 

要么:

 composer install --prefer-source 

然后,您将获得软件包作为克隆存储库,而不是提取tarballs,所以你可以做一些改变,并提交回来。 当然,假设你有对存储库的写入/推送权限,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的仓库部分。

请记住,如果您要在您的require部分将叉引用为my-foo/bar ,则必须在新repo的composer.json文件中重命名该包。

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

如果你刚刚分叉最简单的方法来做到这一点是编辑它正确的内部github。

在我的情况下,我使用Symfony2.3.​​x,最小稳定性参数默认为“稳定”(这是好的)。 我想导入一个不是packagist的repo,但是有同样的问题“你的需求不能解决到一套可安装的软件包”。 看来,我试图导入的回购中的composer.json使用最小稳定性“开发”。

所以要解决这个问题,不要忘记validationminimum-stability 。 我解决了这个问题,需要一个dev-master版本,而不是这个post所说的master

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

包部分用于没有composer.json 。 但是,你并没有遵循这个例子,或者它也会起作用。 请阅读关于软件包库的内容:

基本上,您可以定义包含在composer存储库的packages.json的相同信息,但仅限于单个包。 同样,最低要求的字段是名称,版本,dist或source。