使用 PHP 编写器克隆 git repo

我正在尝试使用 作曲家从 github 中自动克隆一个不在 包装商中的 git 存储库,但是它不工作,我不知道我做错了什么。

我认为我必须像这样把它包括在“存储库”中:

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

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

无法将您的需求解决为一组可安装的包。

有人试过这么做吗?

165661 次浏览

如果您希望使用来自 GitHub 的 composer.json,那么可以查看 这个例子(在 VCS 部分下)。

包部分用于没有 composer.json的包。但是,你没有遵循这个例子,否则它也会工作。请务必阅读它所说的关于软件包存储库的内容:

基本上,您定义的信息与编写器存储库的 packages.json中包含的信息相同,但是只针对单个包。同样,最少需要的字段是 name、 version 以及 dist 或 source。

那个包实际上是 可通过包装商订购。在这种情况下,您不需要自定义存储库定义。只要确保添加了具有匹配版本约束的 require(总是需要的)。

一般来说,如果一个软件包在 packagist 上可用,不要会添加一个 VCS 回购,这只会减慢速度。


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

  • 在根 Composer.json 中指定了“存储库”字段(这是一个只针对根用户的字段,忽略来自所需包的存储库定义)
  • 存储库定义指向一个有效的 VCS 回购
  • 如果类型是“ git”而不是“ vcs”(就像你问的那样) ,确保它实际上是 git repo
  • 你有问题包裹的 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不要使用“包”回购。包回购要求您提供的定义中的元数据的 所有,并将 完全无视任何 composer.json提供的区域和来源。它们还有其他限制,比如在大多数情况下不允许进行适当的更新。

避免包裹回购(也可以看看文件)。

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

在我的例子中,我使用 Symfony2.3.x,并且最小稳定性参数默认为“ Stability”(这很好)。我想导入一个回购不在包装,但有同样的问题“您的需求不能解决到一个可安装的软件包集。”. 似乎我试图导入的 repo 中的 poser.json 使用了一个最小稳定性“ dev”。

因此,要解决这个问题,不要忘记验证 minimum-stability。我解决了这个问题,需要一个 dev-master版本,而不是 master在这个 邮寄

您可以像下面这样将 git 存储库包含到 poser.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"
}

我遇到了以下错误: 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 将需要进入您的 comper.json 的存储库部分。

请记住,如果您希望在需求部分中将 fork 称为 my-foo/bar,则必须在新的回购中重命名 composer.json文件中的包。

{
"name":         "foo/bar",


=>


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

如果你已经分叉了,最简单的方法就是在 github 中编辑它。

只要告诉作曲家使用源代码,如果可用:

composer update --prefer-source

或者:

composer install --prefer-source

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

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

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

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

  1. 正如@igorw 的回答中所提到的,到存储库的 URL 必须在 comper.json 文件中指定的情况下,然而,因为在这两种情况下,comper.json 必须存在(不同于@Mike Graf 的第二种方式) ,在 Packagist 上发布它并没有太大的不同(此外,Github 目前提供的包服务是 npm 包) ,只是不同,而不是一旦注册就直接在 Packagist 界面上输入 URL。

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

一个作曲家文件 < strong > (10月18日12:13伊戈尔回答)

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

没有 作曲家文件 < strong > (在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"
}

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