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/phpmd
从composer.lock
中删除phpmd/phpmd
从vendor
文件夹中删除phpmd/phpmd
从composer.lock
中删除phpmd/phpmd
的所有依赖
从vendor
文件夹中删除phpmd/phpmd
的所有依赖项
不要将squizlabs/php_codesniffer
更新到版本2.1.0
编辑: 我更喜欢不需要更改
composer.json
中squizlabs/php_codesniffer
的版本约束
我尝试过的
如果我跑:
php composer.phar remove phpmd/phpmd
这达到了 1、2、3、6 点,但没有达到 4、5 点。
phpmd/phpmd
的依赖关系保留在composer.lock
和vendor
文件夹中。
如果我跑:
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:删除一个包,清理依赖,不要更新其他包的主要内容,如果未能解决你的问题,请参考以下文章