使用PHP composer克隆git repo

mar*_*tin 99 php composer-php packagist

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

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

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],
Run Code Online (Sandbox Code Playgroud)

然后可能在"require"部分列出它.它应该与此示例类似,但它不起作用.它只是给出了这个错误:

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

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

igo*_*orw 135

实际上,这个包可以通过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.

以下是composer.json通过VCS repo安装相同软件包的示例:

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}
Run Code Online (Sandbox Code Playgroud)

VCS回购文档解释了这一切非常好.


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

避免包装回购(参见文档).

  • -1为什么这标记为正确的答案?它确实解决了OP的问题,但Clarence和Mike Graf回答了它背后更普遍的问题.寻找包含非包装项目的方法的任何人都不太可能想要包含DoctrineExtensions. (15认同)
  • `VCS repo docs很好地解释了所有这些....什么? (4认同)
  • 总是看一下`composer.json`中给出的名字. (2认同)
  • @aefxx 我的回答*确实*实际上也解释了一般的一般问题,即必须指定`require`字段。 (2认同)

Mik*_*raf 99

在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"
}
Run Code Online (Sandbox Code Playgroud)

  • 用包存储库替换VCS存储库是个坏主意.目标repo已经有一个`composer.json`,所以使用vcs repo.您的示例也会中断自动加载并忽略`branch-alias`. (7认同)
  • 正如[在存储库页面](http://getcomposer.org/doc/05-repositories.md#package-2)所解释的,包回购必须包含所有信息.如果您不添加`autoload`字段,则不会包含它.基本上你需要将所有信息从`composer.json`复制粘贴到repo定义.VCS repo直接从VCS获取该信息.`branch-alias`的好处在[别名doc](http://getcomposer.org/doc/articles/aliases.md#branch-alias)和[我写的博客文章](https://)中有所解释. igor.io/2013/01/07/composer-versioning.html). (5认同)
  • 为什么这仍然被投票?作曲家甚至[明确声明](http://getcomposer.org/doc/05-repositories.md#package-2)应该避免包装回购.请停止鼓励不良做法. (2认同)

Edr*_*ris 42

您可以将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"
}
Run Code Online (Sandbox Code Playgroud)


Fan*_*mX1 11

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

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

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

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

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}
Run Code Online (Sandbox Code Playgroud)

没有作曲家文件(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"
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ner 6

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

composer update --prefer-source
Run Code Online (Sandbox Code Playgroud)

或者:

composer install --prefer-source
Run Code Online (Sandbox Code Playgroud)

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

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

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