如何让作曲家在所需范围内安装特定依赖项的旧版本?

How to get composer to install older version of a specific dependency within required range?

在我的 composer.json 文件中,我喜欢在 require 部分中尽可能列出(示例)包 x/y 的所有兼容版本。通常看起来像 "x/y": "8-10"。如果我执行 composer install,作曲家当然会安装 x/y 的最新可用版本,即 10.x,这很好,几乎总是如此。但有时我想安装 x/y 的第 8 版只是为了检查我的应用程序是否仍然可以使用第 8 版执行。

另一种情况是,当客户端报告错误并且某些 example/dependency 的版本为 2.10.4,而最新版本为 2.14.2。 example/dependency 不是我的应用程序直接需要的,而是 x/y 传递的。所以我暂时想用 example/dependency 的 2.10.4 版安装我的整个依赖关系树,以便使用该版本的库进行调试。

当然,临时修改 composer.json 以使其需要这些确切的版本是可行的,但这种方法似乎不自然、复杂,并且意味着不小心将修改后的 composer.json 提交到版本的风险控制,从而造成巨大的混乱。

我考虑过修改 composer.lock 因为不小心提交修改后的版本不会真正导致问题。但是为了这样的目的修改composer.lock文件是okay/recommended吗?

理想情况下,我想要一个命令行参数,将某些库修复到某个版本,仅用于一次执行 composer install 命令而不修改 composer.json.

由于 install 旨在从锁定文件中读取,因此此选项对命令没有意义。

但对于 update(如果没有锁定文件,install 的行为与 update 相同),则存在 --prefer-lowest 标志 (docs) .

还有一个选项可以在不影响您的 composer.json 文件的情况下降级特定的软件包,方法是 运行,例如:

composer update --with vendor/package:2.0.1

请注意,这些选项中的任何一个 都会 修改您的锁定文件,因此在测试之后您可能需要 git restore composer.lock 返回到原始状态。

错误地为项目提交锁定文件应该是一个大问题。由于应用程序通常 built/deployed 通过读取锁定文件,处于不一致状态的锁定文件可能会在意想不到的地方破坏东西。

但是,IMO,防止错误地提交和推送更改似乎过度了。开发人员可以对 任何 文件进行更改,如果他们“错误地”提交这些文件,那么事情可能会崩溃。

期待一个基本的“我应该在暂存和提交之前看看发生了什么变化”对我来说似乎是一个很低的标准。