情况
假设我有一个项目,其中包含由 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/配置
2.5.9 symfony/依赖注入
2.5.9 symfony/文件系统
几天后,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
。
从 composer.json
中删除条目,然后运行 composer update phpmd/phpmd
。
至于为什么这是有效的解决方案。我不知道,但这是从 composer.lock
和 /vendor
中完全删除软件包并允许您安装新/替换/冲突软件包所必需的。
做这个:
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
的版本约束的解决方案。抱歉,我应该在我的问题中说明这一点。理想情况下,我正在为其 uninstall
命令寻找类似于 MacPorts 的 --follow-dependencies
标志的内容:“卸载作为已删除端口的依赖项自动安装且不再需要的端口”。
要从 .json 和 .lock 文件中删除包,您必须按如下方式删除包:
composer remove package-name
composer remove
被破坏了。更新作曲家可能会有所帮助。
我找到了这个答案 here,
从 composer.json 中手动删除包。手动删除供应商文件夹。运行 composer install (从您的项目文件夹中)。
Composer 重新安装 composer.json 中列出的包。
composer install
将使用锁定文件并重新安装删除包
我不相信这目前是可能的。这是您可能希望 submit as a feature request Composer 的事情。
同时,我认为您最好的选择是使用选项 #1:php composer.phar remove phpmd/phpmd
它将从您的显式依赖项中删除该包,而不会强制您更新任何内容。已删除的库中的过时依赖项将一直保留到您下次运行 composer update
,无论如何您都应该定期执行此操作。大多数来自旧依赖项的文件都应该设置为以一种或另一种方式自动加载,所以除了它们在磁盘上使用的空间之外,你不应该因为保留这些文件而受到任何真正的惩罚。
不定期副业成功案例分享