尽管有静态版本号,但将 Composer 依赖项更新到最新版本?

Update Composer dependencies to latest despite static version numbers?

如果我使用的是静态版本号,是否可以通过一个命令将我所有的 Composer 依赖项更新到最新版本?我想保留静态版本号,但要更新它们。

谢谢,

你不应该完全想要这个(在大多数情况下)。

一般来说,要更新所有包,您需要更多信息:所有包的版本限制(如果我们仍在使用 3.x,我们应该使用版本 5,它会阻止 BC 吗?),某些软件包可能有特殊的稳定性要求(@beta,等等)。

所以,composer.lockcomposer update 就是为了这个目的。使用 composer.json 定义约束(版本范围、稳定性级别)和 composer.lock 到 "freeze" 您的部门。

如果你使用上面的方案,你可以简单地用 composer install 安装 "frozen" deps(它总是使用 composer.lock 的版本)或者用 composer update 更新到最新版本(将更新 composer.lock)。

Is it possible to update all my Composer dependencies to the latest versions via one command, if I have used static version numbers?

简而言之:不,在 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.phpuv.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. 列出您 composer.json
  2. 中的所有包
  3. 使用您之前列表中的 composer require [package name]
  4. 运行 每个命令,您可以通过自动或手动方式执行

例子

假设您的作曲家有 phpunit/phpunit 软件包等。您的命令之一是

composer require phpunit/phpunit

这将自动更新您 composer.json 中的版本。在极少数情况下,如果您有软件包的开发版本,它可能会将版本降级到最新的稳定版。