将作曲家依赖项更新为最新版本,尽管版本号是静态的?



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

谢谢

如果我

使用了静态版本号,是否可以通过一个命令将所有 Composer 依赖项更新到最新版本?

简而言之:不,目前还没有命令可以自动提升到给定静态版本的最新版本composer.json

您得到的最接近的是composer outdated -D(根包),它显示了根包上过时包的列表,包括packagecurrent versionlatest version。下一步是手动将最新版本号传输到 composer.json 文件中。


如果你想用PHP脚本自动完成此操作,那么以下几行应该可以帮助你开始。该脚本将所有版本号提升为最新版本,而不仅仅是静态版本号。这意味着,如果您只想提高静态数字,则可能需要添加对静态数字的额外检查。

该脚本需要在 CLI 上运行composer outdated --direct > outdated.txt以生成输入文件(或调整脚本以使用 exec/system/passthru/what,并直接处理返回的输出)。

!!请注意,并在独立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 发布了一个漂亮的单行代码......对吧?:)

我多次遇到这个问题,总是寻找答案,但找不到。今天,我花时间为大型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)

命令说明

首先,我找到了所有作曲家包的列表选项(这里是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"

哎呀!我们需要一些空白。在使用add之前,让我们使用map添加它们:

$ 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
...

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

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

假设您的作曲家在所有其他软件包中都有phpunit/phpunit包。 您的命令之一将是

composer require phpunit/phpunit

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

现在可以使用composer showcomposer 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 所做的。

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

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

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

如果您使用上述方案,您可以简单地使用composer install安装"冻结"deps(它始终使用composer.lock中的版本)或使用composer update更新到最新版本(将更新composer.lock)。

相关内容

  • 没有找到相关文章

最新更新