情况
假设我有一个项目,其中包含 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
。
从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.json 中手动删除包。
- 手动删除供应商文件夹。
- 运行
composer install
(从项目文件夹内)。
Composer 重新安装 composer.json 中列出的包。
要从 .json 和 .lock 文件中删除包,您必须按如下方式删除包:
composer remove package-name
我认为目前这是不可能的。这是您可能希望作为功能请求提交给作曲家的那种事情。
同时,我认为您最好的选择是选择选项#1:php composer.phar remove phpmd/phpmd
它将从显式依赖项中删除包,而不会强制您更新任何内容。已删除库中的过时依赖项将保留,直到您下次运行 composer update
,无论如何,您应该定期执行此操作。旧依赖项中的大多数文件应设置为以某种方式自动加载,因此除了它们在磁盘上使用的空间之外,您不应该因为保留这些文件而受到任何真正的惩罚。