如果我使用了靜態版本號,是否可以通過一個命令將我所有的Composer依賴項更新爲最新版本?我想保留靜態版本號,但讓它們更新。儘管有靜態版本號,Update Composer依賴關係到最新版本?
謝謝,
如果我使用了靜態版本號,是否可以通過一個命令將我所有的Composer依賴項更新爲最新版本?我想保留靜態版本號,但讓它們更新。儘管有靜態版本號,Update Composer依賴關係到最新版本?
謝謝,
如果我使用了靜態版本號,是否可以通過一條命令將我所有的Composer依賴項更新爲最新版本?
簡而言之:不,沒有命令自動升級到composer.json
中給定靜態版本的最新版本。
你得到的最接近的是composer outdated -D
(根包),這表明你的根包過時的軟件包,包括package
,current version
和latest 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的...對張貼了一個漂亮的單行? :)
你不應該想要這個(大多數情況下)。一般來說,爲了更新所有的軟件包,你需要更多的信息:所有軟件包的版本限制(如果我們仍然使用3.x,我們是否應該使用版本5,制動BC,),一些軟件包可能會有特殊的穩定性要求(@beta
等)。
因此,composer.lock
和composer update
是爲此目的。使用composer.json
來定義約束條件(版本範圍,穩定性級別),並使用composer.lock
來「凍結」您的折扣。
如果你使用上面的方案,你可以簡單地安裝與composer install
「凍結」 DEPS(它總是使用從composer.lock
版本)或更新到最新的與composer update
(將更新composer.lock
)。
謝謝,在我的情況下,我使用WordPress插件的作曲家,所以我想更新所有最新,然後測試,以確保沒有不良影響。我寧願鎖定一個特定的版本,而不是做一個範圍,以便其他開發人員可以確定它與給定的版本一起工作。 – christian
不客氣!但從另一方面來看:如果你在'composer中鎖定特定版本。json',那麼你的圖書館的用戶將被困在共享版本的版本中。 例如,如果您的庫正在使用Guzzle 6,並且您在'composer.json'中將版本指定爲6.2.3,則最終用戶無法從此版本移動,即使他們想要在關鍵情況下升級Guzzle錯誤修復。 –
謝謝!好點,但我用它來控制WordPress插件更新在這種情況下。 – christian