【发布时间】:2018-03-25 03:06:09
【问题描述】:
我目前安装了一个包“watson/sitemap”。现在,我想在不使用“composer update”的情况下删除它,因为它会更新我不想要的其他包。
任何帮助将不胜感激。
【问题讨论】:
标签: laravel composer-php laravel-5.4
我目前安装了一个包“watson/sitemap”。现在,我想在不使用“composer update”的情况下删除它,因为它会更新我不想要的其他包。
任何帮助将不胜感激。
【问题讨论】:
标签: laravel composer-php laravel-5.4
我不确定这是否可能。重申你的问题。您的 composer.json 中有 watson/sitemap,您已经执行了 composer update 来下载包及其依赖项。现在您想删除包但保留依赖包吗?
我不确定有什么好的方法可以做到这一点,你必须在某个时候运行composer update,它只会再次下载它。如果我的解释是正确的,也许您的解决方案是添加您在摆脱 watson/sitemap 时不想删除的其他包,可能草率地将其依赖项粘贴到您的 composer.json 文件中?
【讨论】:
composer require 使其由作曲家管理。如果您随后手动删除包(从作曲家外部的磁盘中删除),composer update 将添加它作为项目中的依赖项或 composer.json 文件中某些内容的依赖项。正如其他人所提到的......如果你不再想要它,你可以做一个composer remove。我通常只是手动将它从我的composer.json 文件中删除,然后下一个composer update 将删除所有因它而安装的东西。
composer update,因为它会更新其他软件包,您可能需要考虑在您的composer.json 文件中设置更严格的版本要求。这样你就知道作曲家不会升级。这不是 IMO 的最佳想法,我通常坚持使用允许从所有包进行非破坏性更改更新的版本(某些包为 X.Y.*,其他包为 X.* - 取决于项目的版本方案)
composer remove watson/sitemap --no-update
来自CLI Docs:
remove 命令从 composer.json 文件中删除包 当前目录。
php composer.phar remove vendor/package vendor/package2删除需求后,修改后的需求将 已卸载。
从 composer.json 中删除条目,然后运行
composer update watson/sitemap
这将从 composer.lock 和 /vendor
中完全删除一个包【讨论】:
composer remove my/package --no-update,然后运行composer update my/package,这会将它从你的 json 和 lock 文件中删除,而不更新任何其他包。
更新: Composer 2 现已推出,它似乎足够聪明,可以处理递归。你只需要删除有问题的包。
我最近需要这样做。这是一个真实的例子。这很hacky。您可以使用 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 why package/x 不会显示“没有安装的包”,而是例如“package/x v.1.2.3 替换 package/y (*)”。表示该命令不适用于这些软件包。