如果我使用静态版本号,是否可以通过一个命令将我的所有Composer依赖项更新到最新版本?我想保留静态版本号,但要更新它们。
谢谢,
答案 0 :(得分:3)
如果我使用过静态版本号,是否可以通过一个命令将所有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发布了一个漂亮的单行...对吧? :)
答案 1 :(得分:1)
你不应该完全想要这个(在大多数情况下)。
一般情况下,要更新所有软件包,您需要更多信息:所有软件包的版本限制(我们是否应该使用版本5,如果我们仍在使用3.x,它会制动BC),某些软件包可能有特殊稳定性要求(@beta
等)。
因此,composer.lock
和composer update
就是出于此目的。使用composer.json
定义约束(版本范围,稳定性级别)和composer.lock
到&#34;冻结&#34;你的代表。
如果您使用上述方案,您只需安装&#34;冷冻&#34;使用composer install
的代码(它始终使用composer.lock
中的版本)或使用composer update
更新为最新代码(将更新composer.lock
)。
答案 2 :(得分:0)
composer.json
中的所有软件包composer require [package name]
示例
假设你的作曲家有 phpunit/phpunit
包。你的命令之一是
composer require phpunit/phpunit
这将自动更新您的 composer.json
中的版本。在极少数情况下,如果您有一个开发版本的软件包,它可能会将版本降级到最新的稳定版。