在开发过程中(团队中有多人)有时
composer install
返回:
警告:锁定文件未与composer.json 中的最新更改保持同步。您可能会遇到过时的依赖项。运行 update 来更新它们。
有没有办法快速检查这一点(以毫秒为单位,无需进行任何更改)?
我了解作曲家的工作原理。然而,当代码合并时,它并不一定会导致
composer.json
或 composer.lock
文件上的合并冲突,而且当几乎没有任何更改并且该命令需要几分钟时间时,一直运行 composer install
并不有趣。
如果我能够快速测试锁定失败是否不同步,我可以将其构建到 bash 环境中以通知每个命令。类似于人们喜欢将
git status
内置到 bash 提示符中。
此外,这在 CI 中是有意义的,以确保它确实潜入稳定分支。
在较新的版本(我想是 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`.
作曲家< 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);
你可以跑
composer install --dry-run
--dry-run 输出操作但不会执行任何操作(隐式启用--verbose)。
这不会改变任何内容,但如果不是最新的,则会显示警告。但它仍然需要检查服务器上已安装软件包的新版本,因此如果您安装了很多软件包,这可能仍然需要超过几毫秒。无论如何,速度更快。
作曲家< 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
。
我有另一个解决方案,使用
Sha1sum
和 Bash
脚本。仅当项目中的 composer install
或 composer.json
文件发生更改时,我们才能运行 composer.lock
。我在 CI 模型中使用这种方式。
/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 中。否则,它什么也不做。chmod 700 /usr/local/bin/git-update.sh
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-改变/