2017-07-17 201 views
2

當我運行作曲家需要PHPUnit的6.2失敗

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

+0

我用你的composer.json文件創建了一個新項目(製作一個作曲者安裝),然後啓動命令'composer require --dev phpunit/phpunit'沒有任何問題。嘗試啓動一些調試命令,如上面的回答 – Matteo

回答

2

如果運行composer update,並顯示composer.lock文件和vendor文件夾,則Composer將在更新之前將安裝的版本帶入帳戶。

確保您已將鎖定文件提交到您的項目存儲庫中,以便能夠恢復當前版本。然後嘗試另一次更新,但在此之前刪除鎖定文件和供應商文件夾。

我的經驗是,這樣的更新不會受已安裝的版本的影響,這可能會阻止必要的更新。

調試依賴關係的另一個選擇是使用composer why-not phpunit/phpunit 6.2.0(使用您知道存在的顯式版本 - 沒有版本,命令的輸出不是有意義的)。 Composer會爲您提供阻止更新的依賴列表,供您進一步調查。

+0

非常感謝你,它的工作原理 –

+1

不,不,再次不*不解決這個通過刪除鎖文件*!這是有原因的,如果你強迫自己解決這個問題而不刪除,你會知道它爲什麼在那裏!經驗法則:如果您運行'composer update phpunit/phpunit',則只會將phpunit列入白名單進行更新。在你的情況下,由於其他依賴關係,這將不起作用,所以也將它們列入白名單,並在這種情況下再次運行'composer update phpunit/phpunit sebastian/object-enumerator' - 重複此操作直到成功。你也可以將這與上面提到的原因結合起來,然後你就可以事先知道白名單更新的內容 –

+0

@NormanM你的方法是假定更新通常是邪惡的,並且如果任何意外的軟件包也被更新,將會破壞軟件。這可能就是這種情況,如果沒有測試存在,這是一種危險。另一方面,它會使一個相對直接的過程複雜化,因爲軟件應該能夠指定它的依賴關係,並且只要符合要求,任何有意識的更新努力都應該能夠更新任何內容。運行測試,看看它是否仍然有效,然後提交鎖定文件。否則,從vcs中獲取備份並返回到已知的工作版本。 – Sven

7

運行

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

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

--update-與依賴性:另外需要更新新所需的軟件包的依賴關係。

注意在這樣的情況下刪除composer.lock是不是真的最好的主意,因爲它可能會在破壞你的代碼在其他地方的依賴拉動。您實際上只想一次更新特定的依賴項,而不是一次更新所有依賴項。

+0

這對我有用。謝謝。 –