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

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

在开发过程中(团队中有多人)有时

composer install
返回:

警告:锁定文件未与composer.json 中的最新更改保持同步。您可能会遇到过时的依赖项。运行 update 来更新它们。

有没有办法快速检查这一点(以毫秒为单位,无需进行任何更改)?

我了解作曲家的工作原理。然而,当代码合并时,它并不一定会导致

composer.json
composer.lock
文件上的合并冲突,而且当几乎没有任何更改并且该命令需要几分钟时间时,一直运行
composer install
并不有趣。

如果我能够快速测试锁定失败是否不同步,我可以将其构建到 bash 环境中以通知每个命令。类似于人们喜欢将

git status
内置到 bash 提示符中。

此外,这在 CI 中是有意义的,以确保它确实潜入稳定分支。

php bash composer-php
5个回答
27
投票

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

$ composer validate --no-check-all --no-check-publish

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

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

12
投票

作曲家< 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);

8
投票

你可以跑

composer install --dry-run

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

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


8
投票

作曲家< 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
分别为
0
1


0
投票

我有另一个解决方案,使用

Sha1sum
Bash
脚本。仅当项目中的
composer install
composer.json
文件发生更改时,我们才能运行
composer.lock
。我在 CI 模型中使用这种方式。

  1. 创建一个名为
    /usr/local/bin/git-update.sh
    的脚本文件,其内容如下
#!/bin/bash

git pull -q --ff-only

if [[ -f composer.phar ]]; then
    repoName=${PWD##*/} # Get current folder name
    checkFile=/tmp/composer_hash_${repoName}.sha12
    if [[ ! -f $checkFile || $(sha1sum -c ${checkFile} 2> /dev/null | grep FAILED | awk "{print \$2}") == *"FAILED"* ]]; then
        composer install
        retVal=$?
        if [[ $retVal -eq 0 ]]; then
            sha1sum composer.json composer.lock > ${checkFile}
        fi
    fi
fi

说明:

  • 第一次运行此脚本时。
    sha1sum
    命令输出到
    /tmp/composer_hash_${repoName}.sha12
    ,内容如下所示
 20379304c5944d13ef62f01edefa6ee3277a9e8c  composer.json
 afb0f4db50c81e0981e39dcb5b775fdd309319fe  composer.lock
  • 在下一次运行时,
    sha1sum -c /tmp/composer_hash_${repoName}.sha12
    将检查文件中的 SHA-1 校验和。如果您的
    composer.json
    composer.lock
    文件已更改。该脚本运行
    composer install
    并将新的 SHA-1 校验和添加到 file.sha12 中。否则,它什么也不做。
  1. 为此脚本授予权限 700:
chmod 700 /usr/local/bin/git-update.sh
  1. 我假设您将代码项目存储在中央平台(如 GitHub)中。每次将代码更改从远程存储库拉取到本地计算机时。只需在项目目录中运行脚本即可。例如
cd /data/path/to-your-project && /usr/local/bin/git-update.sh

我还为此技巧写了一篇博客,您可以访问我的博客以获取参考 - 请参阅https://stuff4devops.wordpress.com/2023/10/19/run-composer-install-when-composer-files-are-改变/

© www.soinside.com 2019 - 2024. All rights reserved.