安装phpunit/phpunit ^6.2失败。

7

当我运行时

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.

这是我的composer.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 install),然后我顺利地运行了命令composer require --dev phpunit/phpunit。尝试按照上面的答案描述执行一些调试命令。 - Matteo
2个回答

24

运行

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

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

--update-with-dependencies:还更新新添加包的依赖项。

注意:在此类情况下删除composer.lock并不是一个好主意,因为它可能会拉取破坏其他地方代码的依赖项。您真正想要的是逐个更新特定的依赖项,而不是一次性更新所有依赖项。


2
如果您在运行composer update时,同时存在composer.lock文件和vendor文件夹,则Composer会在更新之前考虑已安装的版本。
请确保将锁定文件提交到项目存储库中,以便能够恢复当前版本。然后尝试另一个更新,但在此之前删除锁定文件和供应商文件夹。
我的经验是,这样的更新不会受到已安装版本的影响,这可能会阻止必要的更新。
调试依赖项的另一种选择是使用composer why-not phpunit/phpunit 6.2.0(使用您知道存在的显式版本-没有版本,该命令的输出无意义)。Composer将为您提供阻止更新的依赖项列表,供您进一步调查。

1
不,绝对不要通过删除锁文件来解决这个问题!存在这个文件是有原因的,如果你强制在不删除的情况下解决它,你会了解到它存在的原因!经验法则:如果你运行 composer update phpunit/phpunit,只有phpunit被列入更新白名单。在你的情况下,由于其他依赖项,这种方法不起作用,所以也需要将它们列入白名单并再次运行,例如 composer update phpunit/phpunit sebastian/object-enumerator - 重复此过程直到成功为止。你也可以将这个方法与上面提到的why-not结合使用,这样你就可以预先知道哪些需要列入白名单更新了。 - Norman M
@NormanM 您的方法假设更新通常是有害的,如果任何意外的软件包也被更新,将会破坏软件。这可能是在这里的情况,并且如果没有测试存在,则存在危险。另一方面,它将使一个相对简单的过程变得复杂,因为软件应该能够指定它的依赖关系,并且任何有意识的更新努力都应该能够更新任何符合要求的内容。运行测试,查看是否仍然有效,然后提交锁定文件。否则从vcs获取备份并返回到已知的工作版本。 - Sven
2
@ Sven,你的方法假设每个第三方库都是以同样的精心开发的方式编写的,并且您在包中的测试覆盖了所有第三方依赖性的意外更改。在实际情况下尝试这种方法,涉及数百个软件包,每个更改都必须经过法律文档和测试 - 更不用说有数百个并行分支 - 谁会告诉您一些合并不会再次降低版本 - 这可能会在代码审查/测试中滑过。 - Norman M
实际上,这不仅仅是composer.lock文件,还包括vendor文件夹中的shim。如果您调用composer update并删除vendor文件夹,则会触发完整的更新。无论如何,请备份(vendor文件夹),如果这会导致真正的问题,则应该导致项目使用无法依赖的依赖项。请将其删除。是的,重构时间到了。@NormanM:如果您不希望第三方库以这种方式完成(经过精心开发),为什么要求它们?! - hakre
我同意@NormanM的观点,删除composer.lock来解决这类问题并不是最好的方法。 - localheinz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接