【问题标题】:Remove a package using composer (without updating other packages)使用 composer 删除一个包(不更新其他包)
【发布时间】:2018-03-25 03:06:09
【问题描述】:

我目前安装了一个包“watson/sitemap”。现在,我想在不使用“composer update”的情况下删除它,因为它会更新我不想要的其他包。

任何帮助将不胜感激。

【问题讨论】:

    标签: laravel composer-php laravel-5.4


    【解决方案1】:

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

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

    【讨论】:

    • 我没有使用 composer update 来下载包。我只遵循此链接github.com/dwightwatson/sitemap 中所述的说明。所以你是说我应该使用“composer update”来删除包? “composer update”的复杂之处在于它会更新我不想发生的其他包。
    • composer require 使其由作曲家管理。如果您随后手动删除包(从作曲家外部的磁盘中删除),composer update 将添加它作为项目中的依赖项或 composer.json 文件中某些内容的依赖项。正如其他人所提到的......如果你不再想要它,你可以做一个composer remove。我通常只是手动将它从我的composer.json 文件中删除,然后下一个composer update 将删除所有因它而安装的东西。
    • 如果您不想使用composer update,因为它会更新其他软件包,您可能需要考虑在您的composer.json 文件中设置更严格的版本要求。这样你就知道作曲家不会升级。这不是 IMO 的最佳想法,我通常坚持使用允许从所有包进行非破坏性更改更新的版本(某些包为 X.Y.*,其他包为 X.* - 取决于项目的版本方案)
    【解决方案2】:

    正确的方式:

    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

    中完全删除一个包

    【讨论】:

    • “包裹还在”是什么意思?
    • @sack 尝试破解方式
    • 正确的方法行不通,因为 --no-update 选项只编辑 composer.json,但不会删除包的文件。 (我认为这就是@JonathanSolorzano 的意思。)
    • 是的,我看到从 composer.json 中删除了该行,但供应商目录在那里。
    • 最好的方法是结合这些:composer remove my/package --no-update,然后运行composer update my/package,这会将它从你的 json 和 lock 文件中删除,而不更新任何其他包。
    【解决方案3】:

    更新: Composer 2 现已推出,它似乎足够聪明,可以处理递归。你只需要删除有问题的包。

    我最近需要这样做。这是一个真实的例子。这很hacky。您可以使用 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) 依赖项。很大的区别。这就是为什么你必须找到它们并从你的项目中手动“更新”它们。

    【讨论】:

    • 先生,您帮我解决了很多问题。非常感谢
    • 谢谢,这对我帮助很大。但请记住,这不适用于所有情况。如果孤立依赖项有替换,则 composer why package/x 不会显示“没有安装的包”,而是例如“package/x v.1.2.3 替换 package/y (*)”。表示该命令不适用于这些软件包。
    猜你喜欢
    • 2015-03-12
    • 2016-05-25
    • 2023-03-30
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2017-11-09
    相关资源
    最近更新 更多