Composer不提供diff命令,临时文件(如/tmp/composer_*.zip、vendor/composer/installed.json)非设计用于人工比对;应通过sha256sum或jq清洗后比对哈希或JSON内容,verify-checksums用于校验vendor源码完整性而非临时文件一致性。

Composer 本身不提供“对比两个临时文件”的功能——它没有 composer diff 或类似命令。所谓“临时文件”,通常指 Composer 在执行 install 或 update 过程中生成的中间产物(如下载的 .zip 包、解压缓存、vendor/composer/installed.json 等),它们不是设计用来被人工比对的。
临时文件在哪?先定位再比
Composer 执行时真正会写入临时文件的位置有两个关键路径:
-
sys_get_temp_dir()返回的系统临时目录(Linux/macOS 下通常是/tmp,Windows 下是%APPDATA%\Local\Temp),里面会出现composer_*.zip、composer_*.phar等瞬时包文件 - 项目根目录下的
vendor/composer/子目录,含installed.json、autoload_classmap.php、autoload_static.php等生成文件
注意:vendor/ 本身不是临时目录,它是持久安装目标;而 installed.json 这类文件每次 install 或 dump-autoload 都会重写,内容差异反映的是依赖状态变更,不是“临时文件内容变化”。
用系统命令比对 zip 包或 installed.json
如果你真想确认两次 composer install 是否用了相同的压缩包,或 installed.json 内容是否一致,直接用系统工具最实在:
- 比 zip 包:用
sha256sum composer_*.zip(Linux/macOS)或certutil -hashfile xxx.zip SHA256(Windows)算哈希,再diff两行输出 - 比
installed.json:它本质是 JSON,但含时间戳和随机字段(如time、uid),不能直接diff。推荐先用jq -S . vendor/composer/installed.json | grep -v '"time":' | grep -v '"uid":'清洗后再比 - 别比
autoload_*.php:这些是 PHP 代码生成文件,含绝对路径和随机字符串,每次生成都不同,比了也没意义
verify-checksums 不是用来比临时文件的
composer verify-checksums --strict 的作用对象是 vendor/ 下已解压的源码文件,不是临时 zip 包——它读取 composer.lock 中的 dist.sha256,然后逐个计算 vendor/{vendor}/{package}/ 下所有源文件的 SHA256 并比对。它解决的是「vendor 有没有被篡改」,不是「两次下载的 zip 是否一样」。
如果你发现两次 install 后 vendor/ 内容不一致,优先怀疑是不是没锁死 composer.lock、用了 --prefer-source、或本地改过包代码——而不是去翻 /tmp 里的 zip。
真正需要关注的不是临时文件本身,而是它们所代表的确定性:只要 composer.lock 不变、网络可重现、没手动干预,Composer 就能还原出完全一致的 vendor/。临时文件只是过程产物,删了重来也不影响结果。











