使用composer卸载一个包(不更新其他包)

19

我目前安装了一个名为"watson/sitemap"的软件包。现在,我想删除它,但不想使用"composer update",因为那会更新其他我不想要的软件包。

如果能得到任何帮助,将不胜感激。

4个回答

27

更新:Composer 2已发布,似乎足够智能以处理递归。您只需删除有问题的包即可。

最近我需要这样做。这是一个真实世界的例子。这相当不专业。您可以通过使用Composer的PHP类或解析composer.lock文件来编写脚本,但这是一种手动过程,您可以按照以下步骤进行。

1. 删除不需要的包

composer remove --no-update illuminate/mail
composer update illuminate/mail

2. 查找孤立的依赖关系

composer show -N | xargs -n 1 composer why | grep "There is no installed package"

输出结果(类似于以下内容):

There is no installed package depending on "erusev/parsedown"
There is no installed package depending on "swiftmailer/swiftmailer"
There is no installed package depending on "tijsverkoyen/css-to-inline-styles"

3. 删除孤立的依赖项

composer update erusev/parsedown swiftmailer/swiftmailer tijsverkoyen/css-to-inline-styles

4. 再重复以上步骤

重复步骤2和3,直到找到所有的孤儿包。


说明:如果你使用--no-update标志,你不会升级软件包...然而(截至撰写时,即2020年初),它也不会删除孤立的依赖项。你并没有告诉它不要“升级”。你告诉它不要更新任何已安装的(composer.lock)依赖关系。这是一个很大的区别。这就是为什么你必须找到它们并手动从你的项目中“更新”它们。


先生,您救了我很多麻烦。非常感谢。 - manuerumx
1
谢谢,这对我帮助很大。但请记住,它并不适用于所有情况。如果一个孤立的依赖项有一个替代,那么 composer why package/x 就不会显示 "There is no installed package",而是会显示类似于 "package/x v.1.2.3 replaces package/y (*)" 的内容。这意味着该命令不适用于这些软件包。 - Ekk4rd

11

正确的方式:

composer remove watson/sitemap --no-update

来自CLI文档

The remove command removes packages from the composer.json file from the current directory.

php composer.phar remove vendor/package vendor/package2

After removing the requirements, the modified requirements will be uninstalled.

黑客方法:

composer.json 中删除该条目,然后运行

composer update watson/sitemap

这将彻底从composer.lock/vendor中删除一个软件包。

“Package is still there” 是什么意思? - Jonathan Solorzano
@sack 尝试用hack的方式。 - Jonathan Solorzano
4
正确的方法行不通,因为 --no-update 选项只编辑 composer.json 文件,而不会删除软件包的文件。(我认为这就是 @JonathanSolorzano 的意思。) - joachim
是的,我看到了composer.json中的那行被删除了,但vendor目录还在。 - zeros-and-ones
4
最好的方法是将以下两个命令结合使用:composer remove my/package --no-updatecomposer update my/package。这样可以从您的json和lock文件中删除该软件包,而不会更新其他任何软件包。 - Maikel Koek

0

我使用

composer remove package-name --no-update-with-dependencies

在我看来有效。


0

我不确定这是否可能。重新阐述您的问题。您在composer.json中有watson/sitemap,已执行composer update以下载包及其依赖项。现在您想删除该软件包但保留其依赖软件包?

我不确定是否有好的方法来做到这一点,您必须在某个时候运行composer update,它将再次下载它。如果我的解释正确,也许您的解决方案就是在摆脱watson/sitemap时添加其他需要的软件包,可能会将其依赖关系粘贴到您的composer.json文件中。


1
我没有使用composer update来下载包。我只是按照这个链接https://github.com/dwightwatson/sitemap中的说明进行操作。所以你的意思是说我应该使用"composer update"来移除这个包吗?使用"composer update"的问题在于它会更新其他我不想更新的包。 - papski
composer require 会让它被Composer管理。如果您手动删除了该软件包(在Composer之外从磁盘中删除),则 composer update 将在您的项目中需要它作为依赖项或作为 composer.json 文件中某个内容的依赖项时将其添加回来。正如其他人所提到的...如果您不再需要它,可以使用 composer remove。我通常会手动从我的 composer.json 文件中删除它,下一个 composer update 将删除由于它而安装的所有内容。 - Chris
如果您不想使用 composer update,因为它会更新其他包,您可能需要考虑在 composer.json 文件中设置更严格的版本要求。这样,您就知道 composer 不会升级。在我看来,这不是最好的想法,我通常坚持使用一个版本,允许所有包的非破坏性更改更新(对于某些包是 X.Y.,对于其他包是 X. - 取决于项目的版本方案)。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接