如何测试composer.lock是否是最新的?

Ell*_*nce 8 php bash composer-php

在开发期间(团队中的多个人)有时会composer install返回:

警告:锁定文件与composer.json中的最新更改不是最新的.您可能会过时的依赖项.运行更新以更新它们.

有没有办法快速检查(毫秒,没有做任何更改)?

我理解作曲家是如何运作的.但是,当代码合并在一起时,并不一定会导致composer.jsoncomposer.lock文件上的合并冲突,并且composer install当几乎从不进行任何更改并且该命令需要几分钟时,一直运行并不好玩.

如果我能够快速测试锁定失败是否已经失去同步,我可以将其构建到bash环境中以通知每个命令.类似于人们喜欢将他们git status建立在他们的bash提示中的方式.

更进一步,这在CI中是有意义的,以确保它确实潜入稳定分支.

lif*_*ter 9

在较新的版本(我想1.3+)你可以运行以下:

$ composer validate --no-check-all --no-check-publish
Run Code Online (Sandbox Code Playgroud)

哪个可能输出这样的东西(带有可捕获的错误退出代码):

./composer.json is valid for simple usage with composer but has
strict errors that make it unable to be published as a package:
See https://getcomposer.org/doc/04-schema.md for details on the 
schema
The lock file is not up to date with the latest changes in composer.json, it is recommended that you run `composer update`.
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案。谢谢! (2认同)

Pᴇʜ*_*Pᴇʜ 8

你可以跑

composer install --dry-run
Run Code Online (Sandbox Code Playgroud)

--dry-run输出操作但不执行任何操作(隐式启用--verbose).

这不会改变任何东西,但如果不是最新的则会显示警告.但它仍然需要检查服务器是否有新版本的已安装软件包,因此如果您安装了许多软件包,这可能仍需要超过几毫秒.无论如何它更快.


Dom*_*nck 8

对于作曲家<1.3.0

是的,有一种方法可以很快检查这一点.

"过时"检查基于内容的哈希值composer.json,存储在composer.lock.没有盐,它是内容的直接哈希,所以它非常非常容易.

<?php

$lock = json_decode(file_get_contents('composer.lock'))->hash;
$json = md5(file_get_contents('composer.json'));

if ($lock !== $json) {
    echo "Lock file out of date\n";
    exit(1);
}

echo "Lock file up to date\n";
exit(0);
Run Code Online (Sandbox Code Playgroud)

  • 这一直很有效,直到作曲家v1.3.0-RC(https://github.com/composer/composer/releases/tag/1.3.0-RC),它删除了'hash'属性,只留下'content-hash' ,计算起来有点复杂.这是'content-hash'计算方法:https://github.com/composer/composer/blob/master/src/Composer/Package/Locker.php#L72 (4认同)

Ell*_*nce 7

对于作曲家<1.3.0

从@Domster扩展,纯粹的bash解决方案:

COMPOSER_IN_SYNC=$(expr "`cat composer.lock | grep '"hash":' | cut -d'"' -f4`" = "`md5sum composer.json | cut -d ' ' -f 1`")
Run Code Online (Sandbox Code Playgroud)

$COMPOSER_IN_SYNC将是0或将1分别.

  • 请参阅下面我对Domster解决方案的评论.这曾经工作到composer v1.3.0-RC,它删除了'hash'属性. (2认同)