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

问题描述 投票:0回答:6

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

谢谢,

dependencies composer-php updates
6个回答
20
投票

如果我使用了静态版本号,是否可以通过一个命令将我的所有 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 发布了一篇漂亮的单行...对吗? :)


13
投票

这个问题我已经遇到过很多次了,一直在寻找答案,但找不到答案。今天我花了时间为大型

composer.json
文件找到了一个好的解决方案。

tl;博士

使用这两个命令更新所有包:

所需包

composer require $(composer show -s --format=json | jq '.requires | keys | map(.+" ") | add' -r)

开发包

composer require --dev $(composer show -s --format=json | jq '.devRequires | keys | map(.+" ") | add' -r)

命令解释

首先我找到了所有 Composer 包的列表选项(这里以

wp-cli/wp-cli
为例:

$ composer show -s
name     : wp-cli/wp-cli
descrip. : WP-CLI framework
keywords : cli, wordpress
versions : * 2.7.x-dev
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
homepage : https://wp-cli.org
source   : []  a5336122dc45533215ece08745aead08af75d781
dist     : []  a5336122dc45533215ece08745aead08af75d781
path     : 
names    : wp-cli/wp-cli

support
issues : https://github.com/wp-cli/wp-cli/issues
source : https://github.com/wp-cli/wp-cli
docs : https://make.wordpress.org/cli/handbook/

autoload
psr-0
WP_CLI\ => php/
classmap
php/class-wp-cli.php, php/class-wp-cli-command.php

requires
php ^5.6 || ^7.0 || ^8.0
ext-curl *
mustache/mustache ^2.14.1
rmccue/requests ^1.8
symfony/finder >2.7
wp-cli/mustangostang-spyc ^0.6.3
wp-cli/php-cli-tools ~0.11.2

requires (dev)
roave/security-advisories dev-latest
wp-cli/db-command ^1.3 || ^2
wp-cli/entity-command ^1.2 || ^2
wp-cli/extension-command ^1.1 || ^2
wp-cli/package-command ^1 || ^2
wp-cli/wp-cli-tests ^3.1.6

suggests
ext-readline Include for a better --prompt implementation
ext-zip Needed to support extraction of ZIP archives when doing downloads or updates

解析这个并不容易。但幸运的是,我们可以使用

--format
参数将其获取为 JSON:

$ composer show -s --format=json
{
    "name": "wp-cli/wp-cli",
    "description": "WP-CLI framework",
    "keywords": [
        "cli",
        "wordpress"
    ],
    "type": "library",
    "homepage": "https://wp-cli.org",
    "names": [
        "wp-cli/wp-cli"
    ],
    "versions": [
        "2.7.x-dev"
    ],
    "licenses": [
        {
            "name": "MIT License",
            "osi": "MIT",
            "url": "https://spdx.org/licenses/MIT.html#licenseText"
        }
    ],
    "source": {
        "type": "",
        "url": "",
        "reference": "a5336122dc45533215ece08745aead08af75d781"
    },
    "dist": {
        "type": "",
        "url": "",
        "reference": "a5336122dc45533215ece08745aead08af75d781"
    },
    "suggests": {
        "ext-readline": "Include for a better --prompt implementation",
        "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates"
    },
    "support": {
        "issues": "https://github.com/wp-cli/wp-cli/issues",
        "source": "https://github.com/wp-cli/wp-cli",
        "docs": "https://make.wordpress.org/cli/handbook/"
    },
    "autoload": {
        "psr-0": {
            "WP_CLI\\": "php/"
        },
        "classmap": [
            "php/class-wp-cli.php",
            "php/class-wp-cli-command.php"
        ]
    },
    "requires": {
        "php": "^5.6 || ^7.0 || ^8.0",
        "ext-curl": "*",
        "mustache/mustache": "^2.14.1",
        "rmccue/requests": "^1.8",
        "symfony/finder": ">2.7",
        "wp-cli/mustangostang-spyc": "^0.6.3",
        "wp-cli/php-cli-tools": "~0.11.2"
    },
    "devRequires": {
        "roave/security-advisories": "dev-latest",
        "wp-cli/db-command": "^1.3 || ^2",
        "wp-cli/entity-command": "^1.2 || ^2",
        "wp-cli/extension-command": "^1.1 || ^2",
        "wp-cli/package-command": "^1 || ^2",
        "wp-cli/wp-cli-tests": "^3.1.6"
    }
}

现在我们需要解析 JSON,在我的系统上,我有可用的

jq
命令,它允许您解析 JSON。我找到了一个不错的备忘单,其中包含一些有用的参数,并且能够仅使用
requires
键:

$ composer show -s --format=json | jq '.requires'
{
  "php": "^5.6 || ^7.0 || ^8.0",
  "ext-curl": "*",
  "mustache/mustache": "^2.14.1",
  "rmccue/requests": "^1.8",
  "symfony/finder": ">2.7",
  "wp-cli/mustangostang-spyc": "^0.6.3",
  "wp-cli/php-cli-tools": "~0.11.2"
}

现在我们只需要获取对象的键即可:

$ composer show -s --format=json | jq '.requires | keys'
[
  "ext-curl",
  "mustache/mustache",
  "php",
  "rmccue/requests",
  "symfony/finder",
  "wp-cli/mustangostang-spyc",
  "wp-cli/php-cli-tools"
]

然后我们想要将所有值连接成一个大字符串,我们可以使用

add
:

来实现
$ composer show -s --format=json | jq '.requires | keys | add'
"ext-curlmustache/mustachephprmccue/requestssymfony/finderwp-cli/mustangostang-spycwp-cli/php-cli-tools"

哎呀!我们需要一些空白。让我们在使用

map
之前使用
add
添加它们:

$ composer show -s --format=json | jq '.requires | keys | map(.+" ") | add'
"ext-curl mustache/mustache php rmccue/requests symfony/finder wp-cli/mustangostang-spyc wp-cli/php-cli-tools "

好的,太棒了!但是我们怎样才能摆脱双引号呢?我们使用

-r
参数:

$ composer show -s --format=json | jq '.requires | keys | map(.+" ") | add' -r
ext-curl mustache/mustache php rmccue/requests symfony/finder wp-cli/mustangostang-spyc wp-cli/php-cli-tools

是啊!现在我们有了我们需要的东西。让我们将其放入子命令中并更新所有包:

$ composer require $(composer show -s --format=json | jq '.requires | keys | map(.+" ") | add' -r)
Using version * for ext-curl
Info from https://repo.packagist.org: #StandWithUkraine
Using version ^2.14 for mustache/mustache
Using version ^7.4 for php
Using version ^2.0 for rmccue/requests
Using version ^5.4 for symfony/finder
Using version ^0.6.3 for wp-cli/mustangostang-spyc
Using version ^0.11.15 for wp-cli/php-cli-tools
./composer.json has been updated
...

那个!如果您的项目也有开发要求,则需要运行第二个命令来更新它们,方法是将

--dev
添加到第一个命令,并在过滤器中使用
devRequires
而不是
requires

$ composer require --dev $(composer show -s --format=json | jq '.devRequires | keys | map(.+" ") | add' -r)
Using version dev-latest for roave/security-advisories
Using version ^2.0 for wp-cli/db-command
Using version ^2.2 for wp-cli/entity-command
Using version ^2.1 for wp-cli/extension-command
Using version ^2.2 for wp-cli/package-command
Using version ^3.1 for wp-cli/wp-cli-tests
./composer.json has been updated
...

我希望这可以帮助每个经常想要更新所有软件包的人


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

示例

假设您的作曲家在所有其他包中都有

phpunit/phpunit
包。您的命令之一将是

composer require phpunit/phpunit

这将自动更新您的

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


3
投票

现在可以使用

composer show
composer require
:

composer show --no-dev --direct --name-only | xargs composer require

对于开发人员依赖性,它变得更加棘手:

grep -F -v -f <(composer show --direct --no-dev --name-only | sort) <(composer show --direct --name-only | sort) | xargs composer require --dev

这相当于 npm-check-updates (ncu) 对 NPM 的作用。


1
投票

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

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

@beta
等)。

因此,

composer.lock
composer update
就是为了这个目的而存在的。使用
composer.json
定义约束(版本范围、稳定性级别),并使用
composer.lock
“冻结”您的部门。

如果您使用上面的方案,您可以简单地使用

composer install
安装“冻结”依赖项(它始终使用
composer.lock
中的版本)或使用
composer update
更新到最新版本(将更新
composer.lock
)。


0
投票

https://packagist.org/packages/chx/jump实现了

composer jump
,它正是这样做的。在尝试之前,请确保对您的
composer.json
进行版本控制:

composer require chx/jump
composer jump
© www.soinside.com 2019 - 2024. All rights reserved.