Composer:删除包,清理依赖项,不更新其他包

时间:2015-01-14 14:04:00

标签: php composer-php

情况

假设我有一个由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. phpmd/phpmd
  2. 删除composer.json
  3. phpmd/phpmd
  4. 删除composer.lock
  5. phpmd/phpmd文件夹
  6. 中删除vendor
  7. phpmd/phpmd
  8. 删除composer.lock的所有依赖项
  9. phpmd/phpmd文件夹
  10. 中删除vendor的所有依赖项
  11. 请勿将squizlabs/php_codesniffer更新为版本2.1.0
  12. 编辑:我更喜欢不需要更改的解决方案 squizlabs/php_codesniffer

    composer.json的版本约束

    我尝试了什么

    如果我跑:

    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

5 个答案:

答案 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

  1. 从composer.json中手动删除软件包。
  2. 手动删除供应商文件夹。
  3. 运行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之前,已移除的库中的过时依赖项将保留,这是您应该定期执行的操作。来自旧依赖项的大多数文件应该设置为自动加载,因此除了在磁盘上使用的空间之外,不应该有任何实际的惩罚。