私有作曲家软件包 - 未找到有效的作曲家.json

2022-08-31 00:52:57

我正在尝试使用作曲家加载我在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,如文档中所述。这将成功克隆主分支,但随后导致以下错误:

[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

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

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

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


答案 1

我知道这有点旧,但对于一些可能遇到此问题的人来说,这就是它对我的工作方式。

清除作曲家缓存。

composer clearcache

重新运行 satis 生成脚本。


答案 2

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

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

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

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

这样做将使您能够需要0.3.x的最新开发版本,如下所示:

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

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

您当前的设置方式迫使您明确包含版本 0.3,这是一个移动目标,而不会明确说明这一事实。

仅当没有可用的版本控制系统能够为 Composer 提供版本号时,即没有可用的标签,或者标签不符合 Composer 对版本号的要求,才应提供显式版本标签。由于您似乎可以控制该vcs,因此使标签符合Composers标准而不是使发布新版本变得麻烦可能是一个好主意。

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

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


推荐