"composer.lock" 没有显示确切的版本

"composer.lock" does not show the exact version

根据 composer documentationcomposer.lock 文件应始终记录项目中安装的包的确切版本。

但是,有时我会看到 composer.lock 中的一些软件包没有确切的版本号,而是有一个范围值,例如 "^7.0 || ^8.0".

这是什么意思?

您可能没有阅读已安装包的版本,它确实被指定为一个离散版本(例如 4.1.5,没有范围,只是一个特定的版本限制),但其中一个的要求安装包。

如果您正在查看 packages 的内容,在 composer.lock 中,只有根包具有独立的版本号。例如:

{
    "_readme": "foo bar",
    "content-hash": "1098098s908019foobar",
    "packages": [
        {
            "name": "somevendor/somepackage",
            "version": "1.2.3" // <-- specific version, no range
            // etc
        }
    ]
}

但是每个包的每个包都包含 requirerequire-dev 部分(除其他外)。因此,如果您继续向下钻取,您会看到如下内容:

{
        "name": "somevendor/somepackage",
        "version": "1.2.3" <-- specific version, no range
        "source": {
            "type": "git",
            "url": "https://github.com/somevendor/somepackage.git",
            "reference": "a035d3d2de85f762233aedbc6522f22ee29e5252"
        },
        "dist": {
            "type": "zip",
            "url": "https://api.github.com/repos/somevendor/somepackage/zipball/a035d3d2de85f762233aedbc6522f22ee29e5252",
            "reference": "a035d3d2de85f762233aedbc6522f22ee29e5252",
            "shasum": ""
        },
            "require": {
                "php": "^7.0 || ^8.0" // <-- like here
            }
        }
}

等等

composer 在 installing/updating 新包时使用该信息,因此它不需要每次都再次遍历所有包的 composer.json 文件。

但是每个 安装的 软件包的特定版本号在 composer.lock 上正确声明。