【问题标题】:Private composer packages - no valid composer.json was found私有作曲家包 - 没有找到有效的 composer.json
【发布时间】:2013-11-24 11:43:03
【问题描述】:

我正在尝试使用 official documentationhere 中所述的 composer 加载我在 BitBucket 上托管的库,但一直收到以下错误:

[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of [repository URL], could not load a package from it.

这是我的项目 composer.json:

{
    "name": "Project name",
    "require": {
        "my-vendor/my-package": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": [repository URL]
        }
    ]
}

这是我远程存储库中的 composer.json(显然找不到):

{
    "name": "my-vendor/my-package",
    "version": "0.3",
    "autoload": {
        "psr-0": {
            "NS_": "src"
        }
    }
}

我应该提一下,两个 composer.json 文件都应该在根目录中。

其他一些注意事项:

我也尝试过“非作曲家包”方法,我在我的项目 composer.json 中指定包信息,并从我的远程存储库中省略 composer.json,如 documentation 中所述。这成功克隆了 master 分支,但随后导致以下错误:

[RuntimeException]
Failed to execute git checkout "master" && git reset --hard "master"

fatal: Not a git repository (or any of the parent directories): .git

但是,包已按预期下载到 /vendor,所以我不确定它为什么要再次尝试检查 master。

这不是我希望解决此问题的方式(因为我宁愿使用远程存储库中的 composer.json),但它可能有助于在其他地方发现问题。

感谢您的帮助。

编辑

我已经设法通过 HTTP 引用 package.json 来让它工作:

"repositories": [
    {
        "type": "composer",
        "url": "http://localhost/packages.json"
    }
]

packages.json 看起来像:

{
    "packages": {
        "vendor/my-package": {
            "dev-master": {
                "name": "vendor/my-package",
                "version": "dev-master",
                "source": {
                    "url": [repository URL],
                    "type": "git",
                    "reference": "master"
                }
            }
        }
    }
}

这是让它工作的唯一方法吗?如果我只打算使用一两个内部包,那么托管我自己的 packages.json 文件似乎有点矫枉过正。

不管怎样,这给了我之前提到的同样的 Git 错误。

编辑 2

强制出错(无效的 SSH 密码)给出:

[RuntimeException]
Failed to execute git clone "[repository URL]" "C:\workspace\DFv3\vendor\vendor/my-package" && cd /D "C:\workspace\DFv3\vendor\vendor/my-package" && git remote add composer "[repository URL]" && git fetch composer

所以我可以清楚地看到它在这里做什么。但是,似乎这条命令将cds 运行到.git 目录并尝试运行:

git checkout "master" && git reset --hard "master"

大概是为了摆脱它拉出的作曲家实例。但是,它在错误的目录中运行它,我不知道为什么..

【问题讨论】:

  • 远程仓库中的composer.json是存在于master分支还是只是一个开发分支? Composer(不幸的是)只在我相信的主分支中查找。
  • 奇怪,错误消息暗示它在所有分支中查找。无论哪种方式,master 都有 composer.json 文件。
  • 主分支是否设置为“默认分支”(查找位置在stackoverflow.com/questions/14040754/… 中进行了描述)我以前从未见过有人必须使用"reference": "master"。跨度>
  • 是的,master 被设置为 Bitbucket 的主分支。如果我省略“reference”,我会收到一条错误消息,指出它希望“source”包含属性“type”、“url”和“reference”。

标签: php composer-php package-managers


【解决方案1】:

虽然这可能被认为是死灵法,但我昨天在遇到这样的问题时偶然发现了这个问题(尽管在我的情况下,我运行的是 Ubuntu Docker 容器,而不是像 OP 那样运行 Windows)并认为我会留下我的想法如果其他人偶然发现此问题,请在此处解决。

Composer 的 Ubuntu 存储库版本目前处于 1.6.x(在撰写本文时,我相信 Composer 已达到 1.9.1)并且我遇到不同的错误,具体取决于我是否以不同级别运行 composer install的日志记录。如果没有记录,它会抱怨找不到有效的composer.json。通过日志记录,它抱怨它无法访问 repo(尽管扫描了标签)。

我的解决方案是全局安装最新版本的 Composer,因为 Ubuntu 存储库版本使用过时的 BitBucket API 调用(不推荐使用 v1)。在我更新到更新版本的 Composer 后,安装运行完美。

因此,请检查您的 Composer 版本并尽可能安装更新版本(本地/项目安装也应该可以)。

【讨论】:

    【解决方案2】:

    我刚刚将 composer.json 更新到最新版本,问题就消失了。

    【讨论】:

      【解决方案3】:

      我已经设法通过 HTTP 引用 package.json 使其工作:

      "repositories": [
          {
              "type": "composer",
              "url": "http://localhost/packages.json"
          }
      ]
      

      所以packages.json 文件看起来像:

      {
          "packages": {
              "vendor/my-package": {
                  "dev-master": {
                      "name": "vendor/my-package",
                      "version": "dev-master",
                      "source": {
                          "url": [repository URL],
                          "type": "git",
                          "reference": "master"
                      }
                  }
              }
          }
      }
      

      另外,我在命令提示符下的自动运行注册表项似乎干扰了作曲家的运行。

      请参阅:Requiring a private git Bitbucket repository fails to find valid composer.json

      【讨论】:

      • 请注意,您在问题中没有提到您使用了您在此处提到的版本行。这可能会首先触发另一个响应。我无法评论 Windows shell 中的自动运行功能是否会影响 Composer。
      【解决方案4】:

      我知道这有点老了,但对于一些可能遇到这个问题的人来说,这就是它的工作原理。

      清除作曲家缓存。

      composer clearcache

      重新运行满足构建脚本。

      【讨论】:

      • 谢谢。这对我有用。我使用以前运行良好的软件包遇到了这个问题。仅在迁移到新计算机后我才开始收到此错误。我需要做的就是清除作曲家缓存。唷。
      • 不错!很高兴知道这有帮助:)
      【解决方案5】:

      我遇到了同样的错误,从 vcs 删除文件夹后一切正常

      sudo rm -R ~/.composer/cache/vcs/*
      

      在 Windows 上(如 @Serbu 建议的那样):

      清除下的vcs、repo和files目录 C:\Users\Me\AppData\Local\Composer\

      【讨论】:

      • 为我(在 Windows 上)清除 C:\Users\Me\AppData\Local\Composer\ 下的 vcs、repo 和文件目录节省了一天
      • 感谢@SerbuFlorin-Adrian 这解决了我在 Windows 上的问题。
      【解决方案6】:

      如果库的 composer.json 实际上由受支持的源代码控制系统管理,则不得在库的 composer.json 中包含 version 规范。目前您说您的主分支是 0.3 版(这是一个稳定版本),但您正在尝试包含“dev-master”(这是一个不稳定版本)。如果该软件真的是“dev-master”或“0.3 版”,Composer 可能会感到困惑。

      如果您实际上是在 master 分支中为 0.3.x 系列开发新版本,则应改为定义分支别名。将此添加到您当前的 0.3.x 版本的开发分支中:

      "extra": {
          "branch-alias": {
              "dev-master": "0.3.x-dev"
          }
      }
      

      如果您想继续升级到 0.4 或 1.0 版本,您可以在 0.3 系列的“最后”状态下使用名为“0.3.x”的分支进行分支,然后将 master 分支中的 composer.json 更新为将 dev-master 指向一个新的别名(如 "dev-master": "0.4.x-dev")。您也可以随意命名旧的 0.3 分支,然后为该分支添加别名。

      这样做将使您能够像这样要求最新的 0.3.x 开发版本:

      "require": {
          "my-vendor/my-package": "0.3.*@dev"
      }
      

      这将拉取最新的 0.3 版本 - 由于定义的别名,当前将是 master 分支中的最新提交。

      您当前的设置方式会强制您明确包含 0.3 版,这是一个移动目标,但并未明确说明这一事实。

      只有在没有可用的版本控制系统能够为 Composer 提供版本号时,才应该给出明确的版本标签,即没有可用的标签,或者标签不符合 Composer 对版本号的要求。由于您似乎可以控制该 vcs,因此最好使标签符合 Composers 标准,而不是让发布新版本变得麻烦。

      修复此问题后,我确实希望您的安装不再需要该 package.json 文件,因为该文件现在修复了您使用该版本声明创建的问题。然后,您也不再需要该作曲家参考,但可以像您一样恢复提及原始存储库。

      如果您觉得自己使用了太多私有存储库,而这些私有存储库都需要更多私有存储库,并且厌倦了在长长的列表中提及它们,您可以考虑使用 Satis 创建这样一个找到的软件包列表手动创建它们。

      【讨论】:

        猜你喜欢
        • 2012-11-11
        • 2017-02-06
        • 1970-01-01
        • 2015-02-17
        • 2013-07-21
        • 2014-11-19
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多