使用composer删除软件包(不更新其他软件包)

pap*_*ski 3 laravel composer-php laravel-5.4

我目前已安装“ watson / sitemap”软件包。现在,我想删除它而不使用“ composer update”,因为它会更新我不想要的其他软件包。

任何帮助将非常感激。

Der*_*and 19

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

我最近需要这样做。这是一个真实的例子。这很hacky。您可以通过使用 Composer 的 PHP 类或解析composer.lock文件来编写脚本,但这是您可以遵循的手动过程。

1. 删除不需要的包

composer remove --no-update illuminate/mail
composer update illuminate/mail
Run Code Online (Sandbox Code Playgroud)

2. 寻找孤立的依赖

composer show -N | xargs -n 1 composer why | grep "There is no installed package"
Run Code Online (Sandbox Code Playgroud)

输出(类似这样):

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"
Run Code Online (Sandbox Code Playgroud)

3. 移除孤立的依赖

composer update erusev/parsedown swiftmailer/swiftmailer tijsverkoyen/css-to-inline-styles
Run Code Online (Sandbox Code Playgroud)

4.冲洗,重复

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


澄清:如果您使用该--no-update标志,您将不会升级包……但是(截至撰写本文时,2020 年初)它也不会删除孤立的依赖项。你不是告诉它不要“升级”。您告诉它不要更新任何已安装的 ( composer.lock) 依赖项。巨大差距。这就是为什么您必须找到它们并从项目中手动“更新”它们。


Jon*_*ano 5

正确的方法:

composer remove watson/sitemap --no-update
Run Code Online (Sandbox Code Playgroud)

CLI文档

remove命令从当前目录中的composer.json文件中删除软件包。

php composer.phar remove vendor/package vendor/package2
Run Code Online (Sandbox Code Playgroud)

删除需求后,将卸载已修改的需求。

破解方式:

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

composer update watson/sitemap
Run Code Online (Sandbox Code Playgroud)

这将完全从composer.lock/ vendor中删除一个软件包

  • 最好的方法是将这些结合起来:“composer remove my/package --no-update”,然后运行“composer update my/package”,这会将其从 json 和锁定文件中删除,而不更新任何其他包。 (5认同)
  • 正确的方法不起作用,因为 --no-update 选项只编辑 composer.json,但不会删除包的文件。(我认为这就是@JonathanSolorzano 的意思。) (3认同)

Chr*_*ris 0

我不确定这是否可能。重申你的问题。在您watson/sitemap的composer.json中,您已经执行了acomposer update来下载包及其依赖项。现在您想删除该包但保留依赖包吗?

我不确定有什么好的方法可以做到这一点,您必须composer update在某个时候运行,这只会再次下载它。如果我的解释是正确的,也许你的解决方案是添加你需要的其他包,当你摆脱时你不想删除它们watson/sitemap,可能会马虎/将它的依赖项粘贴到你的composer.json文件中?