ChatGPT解决这个技术问题 Extra ChatGPT

Composer:删除一个包,清理依赖,不要更新其他包

情况

假设我有一个项目,其中包含由 Composer 安装的两个包:

php composer.phar require 'squizlabs/php_codesniffer:~2.0' 'phpmd/phpmd:~2.1'

自动生成的 composer.json 文件如下所示:

{
    "require": {
        "squizlabs/php_codesniffer": "~2.0",
        "phpmd/phpmd": "~2.1"
    }
}

在自动生成的 composer.lock 文件中,有两个请求的包:

2.0.0 squizlabs/php_codesniffer

2.1.3 phpmd/phpmd

以及 phpmd/phpmd 的四个依赖项:

2.0.4 pdepend/pdepend

2.5.9 symfony/配置

2.5.9 symfony/依赖注入

2.5.9 symfony/文件系统

几天后,squizlabs/php_codesniffer 版本 2.1.0 发布,但我还不想运行 update。我现在想继续使用版本 2.0.0,也许我会在几天后运行 update

问题

我现在想从我的项目中删除 phpmd/phpmd。我想达到以下几点:

从 composer.json 中删除 phpmd/phpmd 从 composer.lock 中删除 phpmd/phpmd 从 vendor 文件夹中删除 phpmd/phpmd 从 composer.lock 中删除 phpmd/phpmd 的所有依赖项 从 vendor 文件夹中删除 phpmd/phpmd 的所有依赖项 不要将 squizlabs/php_codesniffer 更新到 2.1.0 版

编辑:我更喜欢不需要在 composer.json 中更改 squizlabs/php_codesniffer 的版本约束的解决方案

我试过的

如果我运行:

php composer.phar remove phpmd/phpmd

这达到了第 1、2、3、6 点,但没有达到第 4、5 点。

phpmd/phpmd 的依赖项保留在 composer.lockvendor 文件夹中。

如果我运行:

php composer.phar remove phpmd/phpmd
php composer.phar update

这达到了第 1、2、3、4、5 点,但没有达到第 6 点。

squizlabs/php_codesniffer 更新到版本 2.1.0


k
kzap

composer.json 中删除条目,然后运行 composer update phpmd/phpmd

至于为什么这是有效的解决方案。我不知道,但这是从 composer.lock/vendor 中完全删除软件包并允许您安装新/替换/冲突软件包所必需的。


Ty 很多,似乎作曲家充满了黑客,有时 id 不让我升级但让我删除+安装。万一你的治疗就像一个魅力
您可以将此答案设置为解决方案吗?
不是任何一种hack。 “composer update”根据设置的 json 更新锁,然后安装包等。您指定包的事实意味着只有该包将在锁中被修改。这实际上是基本用法,并在文档 (getcomposer.org/doc/01-basic-usage.md) 中指定。
K
Kevin G.

做这个:

php composer.phar remove phpmd/phpmd

修改 composer.json 文件,使其包含以下要求部分。

{
    "require": {
        "squizlabs/php_codesniffer": "2.0.*",
    }
}

现在运行 composer.phar update。这应该能让你到达你想去的地方。

注意:您还可以将 php_codesniffer 包固定到特定版本,例如 2.0.0。有关 composer 如何进行版本控制的更多信息,请参见 here


谢谢您的回答。这确实实现了我想要的。但是,如果可能的话,我更喜欢不需要在 composer.json 中更改 squizlabs/php_codesniffer 的版本约束的解决方案。抱歉,我应该在我的问题中说明这一点。理想情况下,我正在为其 uninstall 命令寻找类似于 MacPorts 的 --follow-dependencies 标志的内容:“卸载作为已删除端口的依赖项自动安装且不再需要的端口”。
有一个 --update-with-dependencies 标志。也许这就是你要找的
L
Lauris Kuznecovs

要从 .json 和 .lock 文件中删除包,您必须按如下方式删除包:

composer remove package-name

该问题明确指出这不会导致所需的行为。你能详细说明为什么你认为这确实有效吗?
这个解决方案对我来说很好 - Laravel 6.0。无需从 json 文件或锁定文件中删除任何其他内容。
显然,作曲家中有一个错误,其中 composer remove 被破坏了。更新作曲家可能会有所帮助。
J
JimB814

我找到了这个答案 here

从 composer.json 中手动删除包。手动删除供应商文件夹。运行 composer install (从您的项目文件夹中)。

Composer 重新安装 composer.json 中列出的包。


如果您还从 composer.lock 中删除了这些包,那么这将有效。反正对我来说。
你能解释一下这在今天是如何运作的吗? composer install 将使用锁定文件并重新安装删除包
M
Michael Cordingley

我不相信这目前是可能的。这是您可能希望 submit as a feature request Composer 的事情。

同时,我认为您最好的选择是使用选项 #1:php composer.phar remove phpmd/phpmd

它将从您的显式依赖项中删除该包,而不会强制您更新任何内容。已删除的库中的过时依赖项将一直保留到您下次运行 composer update,无论如何您都应该定期执行此操作。大多数来自旧依赖项的文件都应该设置为以一种或另一种方式自动加载,所以除了它们在磁盘上使用的空间之外,你不应该因为保留这些文件而受到任何真正的惩罚。