假设我有一个由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
。我想达到以下几点:
phpmd/phpmd
composer.json
phpmd/phpmd
composer.lock
phpmd/phpmd
文件夹vendor
phpmd/phpmd
composer.lock
的所有依赖项
phpmd/phpmd
文件夹vendor
的所有依赖项
squizlabs/php_codesniffer
更新为版本2.1.0
编辑:我更喜欢不需要更改的解决方案
squizlabs/php_codesniffer
composer.json
的版本约束
如果我跑:
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
。
答案 0 :(得分:36)
从composer.json
删除条目,然后运行composer update phpmd/phpmd
。
至于为什么这是有效的解决方案。我不知道,但这是从composer.lock
和/vendor
完全删除包所需要的,并允许您安装新的/替换/冲突包。
答案 1 :(得分:16)
这样做:
php composer.phar remove phpmd/phpmd
修改composer.json文件,使其包含以下require部分。
{
"require": {
"squizlabs/php_codesniffer": "2.0.*",
}
}
现在运行composer.phar update
。这应该可以让你到达目的地。
注意:您还可以将php_codesniffer包固定到特定版本,例如2.0.0
。有关作曲家如何进行版本控制的更多信息,请参见here。
答案 2 :(得分:2)
我找到了这个答案here,
composer install
(从项目文件夹中)。Composer重新安装composer.json中列出的软件包。
答案 3 :(得分:1)
要从.json和.lock文件中删除软件包,您必须按照以下步骤删除软件包:
composer remove package-name
答案 4 :(得分:0)
我认为目前无法做到这一点。这是你可能希望submit as a feature request到Composer的那种东西。
与此同时,我认为最好的选择是选择#1:php composer.phar remove phpmd/phpmd
它会从您的显式依赖项中删除该包,而不会强制您更新任何内容。在您下次运行composer update
之前,已移除的库中的过时依赖项将保留,这是您应该定期执行的操作。来自旧依赖项的大多数文件应该设置为自动加载,因此除了在磁盘上使用的空间之外,不应该有任何实际的惩罚。