我目前安装了一个名为"watson/sitemap"的软件包。现在,我想删除它,但不想使用"composer update",因为那会更新其他我不想要的软件包。
如果能得到任何帮助,将不胜感激。
我目前安装了一个名为"watson/sitemap"的软件包。现在,我想删除它,但不想使用"composer update",因为那会更新其他我不想要的软件包。
如果能得到任何帮助,将不胜感激。
更新:Composer 2已发布,似乎足够智能以处理递归。您只需删除有问题的包即可。
最近我需要这样做。这是一个真实世界的例子。这相当不专业。您可以通过使用Composer的PHP类或解析composer.lock
文件来编写脚本,但这是一种手动过程,您可以按照以下步骤进行。
composer remove --no-update illuminate/mail
composer update illuminate/mail
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"
composer update erusev/parsedown swiftmailer/swiftmailer tijsverkoyen/css-to-inline-styles
重复步骤2和3,直到找到所有的孤儿包。
说明:如果你使用--no-update
标志,你不会升级软件包...然而(截至撰写时,即2020年初),它也不会删除孤立的依赖项。你并没有告诉它不要“升级”。你告诉它不要更新任何已安装的(composer.lock
)依赖关系。这是一个很大的区别。这就是为什么你必须找到它们并手动从你的项目中“更新”它们。
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
--no-update
选项只编辑 composer.json
文件,而不会删除软件包的文件。(我认为这就是 @JonathanSolorzano 的意思。) - joachimcomposer remove my/package --no-update
和composer update my/package
。这样可以从您的json和lock文件中删除该软件包,而不会更新其他任何软件包。 - Maikel Koek我使用
composer remove package-name --no-update-with-dependencies
在我看来有效。
我不确定这是否可能。重新阐述您的问题。您在composer.json中有watson/sitemap
,已执行composer update
以下载包及其依赖项。现在您想删除该软件包但保留其依赖软件包?
我不确定是否有好的方法来做到这一点,您必须在某个时候运行composer update
,它将再次下载它。如果我的解释正确,也许您的解决方案就是在摆脱watson/sitemap
时添加其他需要的软件包,可能会将其依赖关系粘贴到您的composer.json文件中。
composer require
会让它被Composer管理。如果您手动删除了该软件包(在Composer之外从磁盘中删除),则 composer update
将在您的项目中需要它作为依赖项或作为 composer.json
文件中某个内容的依赖项时将其添加回来。正如其他人所提到的...如果您不再需要它,可以使用 composer remove
。我通常会手动从我的 composer.json
文件中删除它,下一个 composer update
将删除由于它而安装的所有内容。 - Chriscomposer update
,因为它会更新其他包,您可能需要考虑在 composer.json
文件中设置更严格的版本要求。这样,您就知道 composer 不会升级。在我看来,这不是最好的想法,我通常坚持使用一个版本,允许所有包的非破坏性更改更新(对于某些包是 X.Y.,对于其他包是 X. - 取决于项目的版本方案)。 - Chris
composer why package/x
就不会显示 "There is no installed package",而是会显示类似于 "package/x v.1.2.3 replaces package/y (*)" 的内容。这意味着该命令不适用于这些软件包。 - Ekk4rd