2016-12-17 68 views

回答

1

如果我使用了靜態版本號,是否可以通過一條命令將我所有的Composer依賴項更新爲最新版本?

簡而言之:不,沒有命令自動升級到composer.json中給定靜態版本的最新版本。

你得到的最接近的是composer outdated -D(根包),這表明你的根包過時的軟件包,包括packagecurrent versionlatest version名單。下一步是將最新的版本號手動傳輸到composer.json文件中。


如果您想用PHP腳本自動執行此操作,那麼以下幾行代碼將幫助您開始。該腳本將所有版本號升至最新版本,而不僅僅是靜態版本號。這意味着,如果您只想提高這些數字,您可能需要爲靜態數字添加額外的檢查。

該腳本需要在CLI上運行composer outdated --direct > outdated.txt以生成輸入文件(或者調整腳本以使用exec/system/passthru/whatever並直接處理返回的輸出)。

!!小心並在獨立版本composer.json或版本控制下的文件上進行測試,您可以輕鬆地還原任何不需要的修改。

update-composer-json-version-numbers-to-latest-version.php或只是uv.php

<?php 
/** 
* Raise/update static version numbers in composer.json. 
* 
* Run on the CLI: "composer outdated --direct > outdated.txt" 
*/ 
$composerJson = json_decode(file_get_contents('composer.json'), true); 

$listOfOutdatedPackages = file('outdated.txt'); 

foreach($listOfOutdatedPackages as $line) { 

    $regexp = '/(?P<package>[\w]+\/[\w]+).*(?P<currentVersion>\d.\d.\d).*(?P<latestVersion>\d.\d.\d)/'; 
    preg_match($regexp, $line, $matches); 
    $matches = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY); 

    if(isset($matches['package'])) 
    { 
     $package = $matches['package']; 

     if(isset($composerJson['require'][$package])) 
     { 
      $currentVersion = $composerJson['require'][$package]; 
      echo sprintf('Updating %s from %s to %s', $package, $currentVersion, $matches['latestVersion']); 
      $composerJson['require'][$package] = $matches['latestVersion']; 
     } 
     if(isset($composerJson['require-dev'][$package])) 
     { 
      $currentVersion = $composerJson['require-dev'][$package]; 
      echo sprintf('Updating %s from %s to %s', $package, $currentVersion, $matches['latestVersion']); 
      $composerJson['require-dev'][$package] = $matches['latestVersion']; 
     }    
    } 
} 

file_put_contents('composer.json', json_encode($composerJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); 

現在有人用grep/awk的/ sed的...對張貼了一個漂亮的單行? :)

1

你不應該想要這個(大多數情況下)。一般來說,爲了更新所有的軟件包,你需要更多的信息:所有軟件包的版本限制(如果我們仍然使用3.x,我們是否應該使用版本5,制動BC,),一些軟件包可能會有特殊的穩定性要求(@beta等)。

因此,composer.lockcomposer update是爲此目的。使用composer.json來定義約束條件(版本範圍,穩定性級別),並使用composer.lock來「凍結」您的折扣。

如果你使用上面的方案,你可以簡單地安裝與composer install「凍結」 DEPS(它總是使用從composer.lock版本)或更新到最新的與composer update(將更新composer.lock)。

+0

謝謝,在我的情況下,我使用WordPress插件的作曲家,所以我想更新所有最新,然後測試,以確保沒有不良影響。我寧願鎖定一個特定的版本,而不是做一個範圍,以便其他開發人員可以確定它與給定的版本一起工作。 – christian

+0

不客氣!但從另一方面來看:如果你在'composer中鎖定特定版本。json',那麼你的圖書館的用戶將被困在共享版本的版本中。 例如,如果您的庫正在使用Guzzle 6,並且您在'composer.json'中將版本指定爲6.2.3,則最終用戶無法從此版本移動,即使他們想要在關鍵情況下升級Guzzle錯誤修復。 –

+0

謝謝!好點,但我用它來控制WordPress插件更新在這種情況下。 – christian

相關問題