作曲家:删除包,清理依赖项,不更新其他包


Composer: remove a package, clean up dependencies, don't update other packages

情况

假设我有一个项目,其中包含 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。我想实现以下几点:

  1. composer.json中删除phpmd/phpmd
  2. composer.lock中删除phpmd/phpmd
  3. vendor文件夹中删除phpmd/phpmd
  4. composer.lock中删除phpmd/phpmd的所有依赖项
  5. vendor文件夹中删除phpmd/phpmd的所有依赖项
  6. 不要将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

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 .有关作曲家如何进行版本控制的更多信息,请参阅此处。

我在这里找到了这个答案,

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

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

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

composer remove package-name

我认为目前这是不可能的。这是您可能希望作为功能请求提交给作曲家的那种事情。

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

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