【问题标题】:Installation failed for phpunit/phpunit ^6.2phpunit/phpunit ^6.2 安装失败
【发布时间】:2017-12-22 03:00:34
【问题描述】:

当我跑步时

composer require --dev phpunit/phpunit

我收到以下消息:

composer require --dev phpunit/phpunit
Using version ^6.2 for phpunit/phpunit
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
- Installation request for sebastian/object-enumerator (locked at 2.0.1) -> satisfiable by sebastian/object-enumerator[2.0.1].
- phpunit/phpunit 6.2.0 requires sebastian/object-enumerator ^3.0.2 -> satisfiable by sebastian/object-enumerator[3.0.2].
- phpunit/phpunit 6.2.1 requires sebastian/object-enumerator ^3.0.2 -> satisfiable by sebastian/object-enumerator[3.0.2].
- phpunit/phpunit 6.2.2 requires sebastian/object-enumerator ^3.0.2 -> satisfiable by sebastian/object-enumerator[3.0.2].
- phpunit/phpunit 6.2.3 requires sebastian/object-enumerator ^3.0.2 -> satisfiable by sebastian/object-enumerator[3.0.2].
- Conclusion: don't install sebastian/object-enumerator 3.0.2
- Installation request for phpunit/phpunit ^6.2 -> satisfiable by phpunit/phpunit[6.2.0, 6.2.1, 6.2.2, 6.2.3].

Installation failed, reverting ./composer.json to its original content.

这是我的作曲家 json 文件:

"require": {
  "php": "^7.0",
  "laravel/framework": "^5.4",
  "guzzlehttp/guzzle": "^6.3",
  "symfony/psr-http-message-bridge": "^1.0",
  "mcamara/laravel-localization": "^1.2",
  "laravelcollective/html": "^5.4",
  "laravel/socialite": "^3.0",
  "yajra/laravel-datatables-oracle": "^7.9"
},
"require-dev": {
  "fzaninotto/faker": "^1.6",
  "symfony/css-selector": "^3.3",
  "symfony/dom-crawler": "^3.3"
}

我尝试从上面的 5.4 版本获取,但总是遇到类似的错误,但对于其他依赖项,似乎唯一可行的版本是 5.0

【问题讨论】:

  • 我用你的 composer.json 文件创建一个新项目(安装一个 composer)然后我启动命令 composer require --dev phpunit/phpunit 没有任何问题。尝试按照上述答案中所述启动一些调试命令

标签: php phpunit composer-php


【解决方案1】:

如果您在 composer.lock 文件和 vendor 文件夹存在的情况下运行 composer update,Composer 将在更新之前将已安装的版本记入帐户。

确保您已将锁定文件提交到您的项目存储库中,以便能够恢复当前版本。然后尝试另一个更新,但在此之前删除锁定文件和供应商文件夹。

我的经验是这样的更新不会受到已经安装的版本的影响,这可能会阻止必要的更新。

调试依赖项的另一个选项是使用composer why-not phpunit/phpunit 6.2.0(使用您知道存在的显式版本 - 没有版本,命令的输出没有意义)。 Composer 将为您提供阻止更新的依赖项列表,供您进一步调查。

【讨论】:

  • 不行,不行,再不行不要通过删除锁定文件来解决这个问题!这是有原因的,如果你强迫自己在不删除的情况下解决这个问题,你就会知道它为什么存在!经验法则:如果您运行composer update phpunit/phpunit,则只有 phpunit 会被列入更新白名单。在您的情况下,由于其他依赖项,这将不起作用,因此将它们也列入白名单并在这种情况下再次运行 composer update phpunit/phpunit sebastian/object-enumerator - 重复此操作直到成功。你也可以把它和上面提到的why-not结合起来,然后你就提前知道要更新什么白名单
  • @NormanM 您的方法是假设更新通常是邪恶的,并且如果任何意外的软件包也被更新,则会破坏软件。这里可能就是这种情况,如果不存在测试是危险的。另一方面,它会使一个相对简单的过程复杂化,因为软件应该能够指定它的依赖关系,并且任何有意识的更新工作都应该能够更新任何东西,只要它符合要求。运行测试,看看它是否仍然有效,然后提交锁定文件。否则从 vcs 中获取备份并返回到已知的工作版本。
  • @Sven 并且您的方法是假设每个 3rd 方库也都非常谨慎地开发,并且您在包中的测试也涵盖了 3rd 方依赖项的所有意外更改。在涉及数百个包并且每个更改都必须合法记录和测试的实际情况下尝试这种方法 - 更不用说有数百个并行分支 - 谁告诉你某些合并不会再次降低版本 - 这可能会漏掉在代码审查/测试中。
  • 其实这不仅是 composer.lock 也是 vendor 文件夹中的 shim。如果您致电composer update,删除供应商文件夹会触发我的全面更新。无论如何,如果这会导致真正的问题,请保留(供应商文件夹的)备份,这应该会导致项目使用它不能依赖的依赖项。删除这些。是的,重构时间。 @NormanM:如果您不希望第三方库以这种方式完成(非常小心地开发),为什么需要它们?!
  • 我同意@NormanM,删除composer.lock 来解决这样的问题不是最好的主意。
【解决方案2】:

运行

$ composer require --dev phpunit/phpunit --update-with-dependencies

https://getcomposer.org/doc/03-cli.md#require:

--update-with-dependencies:同时更新新需要的包的依赖关系。

注意在这种情况下删除 composer.lock 并不是最好的主意,因为它可能会引入在其他地方破坏您的代码的依赖项。你真的只想一次更新一个特定的依赖,而不是一次更新所有的依赖。

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2018-10-09
    • 2017-06-22
    • 2011-07-06
    • 2011-09-10
    • 2017-01-10
    • 2011-09-29
    • 2011-09-07
    • 2010-11-24
    相关资源
    最近更新 更多