如果我使用了静态版本号,是否可以通过一个命令将我的所有 Composer 依赖项更新到最新版本?我想保留静态版本号,但要更新它们。
谢谢,
如果我使用了静态版本号,是否可以通过一个命令将我的所有 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 发布了一篇漂亮的单行...对吗? :)
这个问题我已经遇到过很多次了,一直在寻找答案,但找不到答案。今天我花了时间为大型
composer.json
文件找到了一个好的解决方案。
使用这两个命令更新所有包:
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
...
我希望这可以帮助每个经常想要更新所有软件包的人
composer.json
composer require [package name]
示例
假设您的作曲家在所有其他包中都有
phpunit/phpunit
包。您的命令之一将是
composer require phpunit/phpunit
这将自动更新您的
composer.json
中的版本。在极少数情况下,如果您有软件包的开发版本,它可能会将版本降级到最新的稳定版本。
现在可以使用
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 的作用。
您不应该完全想要这个(在大多数情况下)。
一般来说,要更新所有软件包,您需要更多信息:所有软件包的版本限制(如果我们仍在使用 3.x,我们是否应该使用版本 5,它会阻碍 BC?),某些软件包可能具有特殊的稳定性要求(
@beta
等)。
因此,
composer.lock
和composer update
就是为了这个目的而存在的。使用 composer.json
定义约束(版本范围、稳定性级别),并使用 composer.lock
“冻结”您的部门。
如果您使用上面的方案,您可以简单地使用
composer install
安装“冻结”依赖项(它始终使用 composer.lock
中的版本)或使用 composer update
更新到最新版本(将更新 composer.lock
)。
https://packagist.org/packages/chx/jump实现了
composer jump
,它正是这样做的。在尝试之前,请确保对您的 composer.json
进行版本控制:
composer require chx/jump
composer jump