繁体   English   中英

使用 PHP composer 克隆 git repo

[英]Use PHP composer to clone git repo

我正在尝试使用composer从 github 自动克隆 git 存储库,该存储库不在packagegist中,但它不起作用,我不知道我做错了什么。

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

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

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

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

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

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

一般而言,如果 packagist 上有可用的包,则不要添加 VCS 存储库。 它只会减慢速度。


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

  • “repositories”字段在根 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 repo 文档很好地解释了所有这些。


如果有可用的composer.json的 git(或其他 VCS)存储库,请不要使用“包”存储库。 包 repos 要求您提供定义中的所有元数据,并且将完全忽略提供的 dist 和源中存在的任何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"
}

您可以像这样将 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 update --prefer-source

或者:

composer install --prefer-source

然后您将获得作为克隆存储库的包而不是提取的 tarball,因此您可以进行一些更改并将它们提交回来。 当然,假设您对存储库具有写入/推送权限并且 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 部分将您的 fork 引用为my-foo/bar ,则必须在新存储库内的composer.json文件中重命名该包。

{
    "name":         "foo/bar",

=>

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

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

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

所以要解决这个问题,不要忘记验证minimum-stability 我通过要求解决它dev-master版本,而不是master在本说明

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

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

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

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

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

没有作曲家文件(Mike Graf 于 13 年 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"
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM