Composer:删除一个包,清理依赖,不要更新其他包

Posted

技术标签:

【中文标题】Composer:删除一个包,清理依赖,不要更新其他包【英文标题】:Composer: remove a package, clean up dependencies, don't update other packages 【发布时间】:2015-03-12 17:54:22 【问题描述】:

情况

假设我有一个项目,其中包含由 Composer 安装的两个包:

php composer.phar require 'squizlabs/php_codesniffer:~2.0' 'phpmd/phpmd:~2.1'

自动生成的composer.json 文件如下所示:


    "require": 
        "squizlabs/php_codesniffer": "~2.0",
        "phpmd/phpmd": "~2.1"
    

在自动生成的composer.lock 文件中,有两个请求的包:

2.0.0 squizlabs/php_codesniffer 2.1.3 phpmd/phpmd

还有phpmd/phpmd的四个依赖:

2.0.4 pdepend/pdepend 2.5.9 symfony/config 2.5.9 symfony/dependency-injection 2.5.9 symfony/filesystem

几天后,squizlabs/php_codesniffer版本2.1.0发布,但我不想要 运行update。我现在想继续使用2.0.0 版本,也许我会在几天后运行update


问题

我现在想从我的项目中删除 phpmd/phpmd。我想达到以下几点:

    composer.json 中删除phpmd/phpmdcomposer.lock 中删除phpmd/phpmdvendor 文件夹中删除phpmd/phpmdcomposer.lock中删除phpmd/phpmd的所有依赖 从vendor文件夹中删除phpmd/phpmd的所有依赖项 不要将squizlabs/php_codesniffer 更新到版本2.1.0

编辑: 我更喜欢不需要更改 composer.jsonsquizlabs/php_codesniffer的版本约束


我尝试过的

如果我跑:

php composer.phar remove phpmd/phpmd

这达到了 1、2、3、6 点,但没有达到 4、5 点。

phpmd/phpmd 的依赖关系保留在composer.lockvendor 文件夹中。

如果我跑:

php composer.phar remove phpmd/phpmd
php composer.phar update

这达到了 1、2、3、4、5 点,但没有达到 6 点。

squizlabs/php_codesniffer 更新到版本2.1.0

【问题讨论】:

见***.com/questions/26930816/… 这能回答你的问题吗? How to remove unused dependencies from composer? 【参考方案1】:

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

至于为什么这是有效的解决方案。我不知道,但这是从 composer.lock/vendor 中完全删除软件包并允许您安装新/替换/冲突软件包所必需的。

【讨论】:

很多,似乎作曲家充满了黑客,有时 id 不让我升级但让我删除+安装。万一你的治疗就像一个魅力 您可以将此答案设置为解决方案吗? 不是任何一种黑客行为。 “composer update”根据设置的 json 更新锁,然后安装包等。您指定包的事实意味着只有该包将在锁中被修改。这实际上是一个基本用法,并在 docs (getcomposer.org/doc/01-basic-usage.md) 中指定。【参考方案2】:

这样做:

php composer.phar remove phpmd/phpmd

修改 composer.json 文件,使其包含以下需求部分。


    "require": 
        "squizlabs/php_codesniffer": "2.0.*",
    

现在运行composer.phar update。这应该会让你到达你想去的地方。

注意:您还可以将 php_codesniffer 包固定到特定版本,例如2.0.0。有关 composer 如何进行版本控制的更多信息,请访问 here。

【讨论】:

感谢您的回答。这确实实现了我想要的。但是,如果可能的话,我更喜欢不需要在composer.json 中更改squizlabs/php_codesniffer 的版本约束的解决方案。抱歉,我应该在我的问题中说明这一点。理想情况下,我正在寻找类似于 MacPorts 的 --follow-dependencies 标志的 uninstall 命令:“卸载作为已删除端口的依赖项自动安装且不再需要的端口”。 有一个 --update-with-dependencies 标志。也许这就是你要找的东西【参考方案3】:

要从 .json 和 .lock 文件中删除包,您必须按如下方式删除包:

composer remove package-name

【讨论】:

该问题明确指出这不会导致所需的行为。您能否详细说明为什么您认为这确实有效? 这个解决方案对我来说很好 - Laravel 6.0。无需从 json 文件或锁定文件中删除任何其他内容。 显然在作曲家中有一个错误,composer remove 被破坏了。更新作曲家可能会有所帮助。【参考方案4】:

我找到了这个答案here,

    从 composer.json 中手动删除包。 手动删除供应商文件夹。 运行composer install(从您的项目文件夹中)。

Composer 重新安装 composer.json 中列出的包。

【讨论】:

如果您还从 composer.lock 中删除了这些包,那么这将有效。反正对我来说。 你能解释一下现在它是如何工作的吗? composer install 将使用锁定文件并重新安装删除包【参考方案5】:

我不相信这目前是可能的。这是您可能希望 submit as a feature request 给 Composer 的事情。

同时,我认为您最好的选择是使用选项 #1:php composer.phar remove phpmd/phpmd

它将从您的显式依赖项中删除该包,而不会强制您更新任何内容。在您下次运行 composer update 之前,已删除库中的过时依赖项将一直保留,无论如何您都应该定期执行此操作。旧依赖项中的大多数文件都应设置为以一种或另一种方式自动加载,因此除了它们在磁盘上使用的空间之外,您不应该因为保留这些文件而受到任何真正的惩罚。

【讨论】:

以上是关于Composer:删除一个包,清理依赖,不要更新其他包的主要内容,如果未能解决你的问题,请参考以下文章

composer update - 更新单个包时如何跳过更新依赖项

从编辑器中排除包更新

阻止 Composer 更新重新安装

为啥更新包时“composer.json”没有更新?

composer.json和composer.lock

我可以清理本地Composer目录吗?