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

时间:2015-02-19 03:20:46

标签: php bash composer-php

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

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

有没有办法快速检查(以毫秒为单位,不做任何更改)?

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

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

更进一步,这在CI中是有道理的,以确保它可以潜入稳定的分支。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:7)

你可以运行

composer install --dry-run
  

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

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

答案 2 :(得分:7)

  

对于作曲家&lt; 1.3.0

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

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

$COMPOSER_IN_SYNC将分别为01

答案 3 :(得分:6)

在较新版本(我想1.3+)上,您可以运行以下命令:

./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`.

可能会输出类似的内容(带有可捕获的错误退出代码):

 Well A B C D

Production 1 2 3 4