使用PHP作曲家克隆git repo


111

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

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

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

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

您的要求无法解决为一组可安装的软件包。

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

Answers:


109

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

你有一个仓库吗?

Git,Mercurial和SVN受Composer支持。

您是否对存储库有书面访问权限?

是?

存放库是否有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
用软件包存储库替换VCS存储库是一个坏主意。目标存储库已经有一个composer.json,因此请使用vcs存储库。您的示例还会中断自动加载,并忽略branch-alias
igorw

1
您可以将@igorw链接到该信息,以便我和其他人可以理解不同之处吗?谢谢。
迈克·格拉夫

5
存储库页面上所述,软件包存储库必须包含所有信息。如果您不添加该autoload字段,则不会包含该字段。基本上,您需要将所有信息从复制粘贴composer.json到回购定义。VCS存储库直接从VCS获取该信息。branch-alias别名doc我写的博客文章中解释了好处。
igorw

2
为什么仍然反对?作曲家的文档甚至明确声明应避免软件包存储库。请停止鼓励不良行为。
igorw

1
您建议我将其更改为什么?
Mike Graf

146

该软件包实际上可以通过packagist获得。在这种情况下,您不需要自定义存储库定义。只需确保添加一个require(始终需要)带有匹配版本约束的文件即可。

通常,如果打包程序上有可用的软件包,请不要添加VCS存储库。它只会减慢速度。


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

  • 在根composer.json中指定了“ repositories”字段(这是一个仅根字段,忽略了必需软件包中的存储库定义)
  • 存储库定义指向有效的VCS存储库
  • 如果类型是“ git”而不是“ vcs”(如您的问题),请确保它实际上是git repo
  • 您有require相关包裹
  • require匹配中的约束与VCS存储库提供的版本匹配。您可以使用composer show <packagename>查找可用版本。在这种情况下,~2.3将是一个不错的选择。
  • 在名称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回购文档解释了这一切非常好。


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

避免软件包回购(另请参阅docs)。


1
哦,谢谢!我没有找到它,因为我认为它会在git repo DoctrineExtensions之后被调用。
马丁

2
始终查看中提供的名称composer.json
igorw

16
-1为什么将此标记为正确答案?它确实确实解决了OP的问题,但Clarence和Mike Graf给出了解决其背后更普遍问题的答案。任何寻求包括非包装项目的方法的人都不太可能希望包含DoctrineExtensions。
aefxx

2
@aefxx我的回答确实在事实上也解释了一般的普遍的问题,这就是require必须指定领域。
igorw

6
The VCS repo docs explain all of this quite well.... 什么?
hek2mgl 2014年

47

您可以像这样将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 '17

将其调整为通用,但基本上是Mike Graf答案的简单副本,因此我不确定通用是否比在问题中查看特定库更好。
FantomX1

6

只要告诉作曲家使用源(如果可用):

composer update --prefer-source

要么:

composer install --prefer-source

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

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

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


3

我遇到以下错误: 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的存储库部分。

请记住,如果要像my-foo/bar您的require部分中那样引用fork ,则必须在composer.json新仓库中的文件中重命名该包。

{
    "name":         "foo/bar",

=>

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

如果您只是分叉了最简单的方法,请在github内部对其进行编辑。


请注意,程序包名称绝不会反映您可以从中读取存储库的URL!两者之间没有自动链接,两者都可以独立选择。与Composer唯一相关的信息是名称写入到name属性里面composer.json
Sven

2

就我而言,我使用Symfony2.3.​​x,默认情况下,最小稳定性参数为“稳定”(很好)。我想导入一个不在packagist中的仓库,但遇到了同样的问题“您的要求无法解决为一组可安装的软件包”。似乎我尝试导入的存储库中的composer.json使用最小稳定性“ dev”。

因此,要解决此问题,请不要忘记验证minimum-stability。我通过要求解决它dev-master的版本,而不是master在此规定


4
我遇到了同样的问题,这里讨论。如果您有明确的ref(例如git commit),则可以执行"dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e"
Blaskovicz

1

如果要使用composer.json来自GitHub的,请查看此示例(在VCS部分下)。

软件包部分适用于没有的软件包composer.json。但是,您也没有很好地遵循该示例,否则它也可能会起作用。请阅读有关软件包存储库的内容:

基本上,您定义的信息与composer信息库的信息相同packages.json,但仅针对单个程序包。同样,最小必填字段是名称,版本以及dist或source。


0

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

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

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

带有作曲家文件(12年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"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.