ChatGPT解决这个技术问题 Extra ChatGPT

使用 PHP composer 克隆 git repo

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

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

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

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

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

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


i
igorw

那个包实际上是is available through packagist。在这种情况下,您不需要自定义存储库定义。只需确保添加具有匹配版本约束的 require(始终需要)。

通常,如果 packagegist 上有包可用,请不要添加 VCS 存储库。它只会减慢速度。

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

“存储库”字段在根 composer.json 中指定(它是一个仅根字段,来自所需包的存储库定义被忽略)

存储库定义指向有效的 VCS 存储库

如果类型是“git”而不是“vcs”(如您的问题),请确保它实际上是一个 git repo

您需要相关软件包

require 中的约束与 VCS 存储库提供的版本相匹配。您可以使用 composer show 来查找可用的版本。在这种情况下,~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 docs 很好地解释了这一切。

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

避免包存储库 (see also the docs)。


欧,谢谢!我没有找到它,因为我认为它会在 git repo DoctrineExtensions 之后被调用。
始终查看 composer.json 中给出的名称。
-1 为什么这被标记为正确答案?它确实解决了 OP 的问题,但 Clarence 和 Mike Graf 给出了其背后更普遍问题的答案。任何寻找包含非打包项目的方法的人都不太可能想要包含 DoctrineExtensions。
@aefxx 我的回答确实其实也说明了一般的普遍问题,就是必须指定require字段。
The VCS repo docs explain all of this quite well. ...什么?
6
6 revs, 4 users 59%

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

你有存储库吗?

Composer 支持 Git、Mercurial 和 SVN。

您对存储库有写入权限吗?

是的?

存储库是否有 composer.json 文件

如果您有可以写入的存储库:添加 composer.json 文件,或修复现有文件,并且不要使用以下解决方案。

转到 @igorw 的 answer

仅当您没有存储库时才使用它
或者如果存储库没有 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"
}

用包存储库替换 VCS 存储库是一个坏主意。目标 repo 已经有一个 composer.json,所以使用 vcs repo。您的示例还中断了自动加载并忽略了 branch-alias
@igorw 您能否链接到该信息,以便我和其他人能够理解其中的区别?谢谢。
on the repositories page 所述,软件包存储库必须包含所有信息。如果您不添加 autoload 字段,它将不会被包含在内。基本上,您需要将所有信息从 composer.json 复制粘贴到 repo 定义中。 VCS 存储库直接从 VCS 获取该信息。 the aliases doca blog post I wrote 中解释了 branch-alias 的好处。
为什么这仍然被赞成?作曲家文档甚至 explicitly state 应该避免包 repos。请停止鼓励不良做法。
你建议我把它改成什么?
E
Edris

您可以像这样将 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.json 文件。
@Sven ...因为否则无法指定特定的提交?
感谢您的分享,为我节省了几个小时:)
这被调整为一般,但基本上是 Mike Graf 答案的普通副本,所以我不确定一般是否比在问题中看到特定库作为示例更好。
@FantomX1 基本上我已经在 2014 年发布了它,而 Mike Graf 的答案在 2017 年更新了,所以你可以清楚地看到谁在抄袭谁:)
J
Josef Kufner

只需告诉作曲家使用源(如果有):

composer update --prefer-source

或者:

composer install --prefer-source

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

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

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


F
FantomX1

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

正如@igorw的回答中提到的那样,存储库的URL必须在composer.json文件中指定,但是因为在这两种情况下composer.json都必须存在(不像@Mike Graf的第二种方式)在Packagist上发布它是差别不大(此外,Github 目前也以 npm 包的形式提供包服务),唯一的区别是注册后在 packagist 界面上直接输入 URL。此外,它的缺点是它不能依赖使用这种方法的外部库,因为递归存储库定义在 Composer 中不起作用。此外,由于它,它似乎有一个“错误”,因为递归定义在依赖项中失败,在根目录中显式重新指定存储库似乎还不够,而且包中的所有依赖项都必须被重新指定。

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

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

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

H
Henry

我遇到了以下错误:The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

如果您要分叉另一个 repo 来进行自己的更改,您最终会得到一个新的存储库。

例如:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

新的 url 需要进入 composer.json 的存储库部分。

请记住,如果您想在 require 部分中将您的 fork 称为 my-foo/bar,则必须在新 repo 内的 composer.json 文件中重命名包。

{
    "name":         "foo/bar",

=>

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

如果您刚刚分叉了最简单的方法,那就是在 github 中对其进行编辑。


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

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

因此,要解决此问题,请不要忘记验证 minimum-stability。我通过要求 dev-master 版本而不是 post 中所述的 master 解决了这个问题。


我遇到了同样的问题,在 here 中进行了讨论。如果您有明确的 ref(如 git commit),您似乎可以执行 "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e" 之类的操作。
k
kenorb

如果您想使用 GitHub 中的 composer.json,您可以查看 this example(在 VCS 部分下)。

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

基本上,您定义包含在作曲家存储库的 packages.json 中的相同信息,但仅限于单个包。同样,最少的必填字段是名称、版本以及 dist 或 source。