尽管有静态版本号,还是将Composer依赖关系更新到最新?

时间:2016-12-17 17:01:46

标签: dependencies composer-php updates

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

谢谢,

3 个答案:

答案 0 :(得分:3)

  

如果我使用过静态版本号,是否可以通过一个命令将所有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.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 :(得分:1)

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

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

因此,composer.lockcomposer update就是出于此目的。使用composer.json定义约束(版本范围,稳定性级别)和composer.lock到&#34;冻结&#34;你的代表。

如果您使用上述方案,您只需安装&#34;冷冻&#34;使用composer install的代码(它始终使用composer.lock中的版本)或使用composer update更新为最新代码(将更新composer.lock)。

答案 2 :(得分:0)

  1. 列出您的 composer.json 中的所有软件包
  2. 使用之前列表中的composer require [package name]
  3. 运行每个命令,您可以通过自动或手动方式执行

示例

假设你的作曲家有 phpunit/phpunit 包。你的命令之一是

composer require phpunit/phpunit

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