composer show --outdated 显示的日期是包在 packagist 上的发布时间,而非本地更新时间;查本地更新时间应检查 vendor/ 目录下对应包的文件修改时间,或用脚本批量获取目录最后变更日期。

composer show --outdated 显示的日期是包的发布日期,不是本地更新时间
Composer 本身不记录每个包在你本地最后一次 composer update 的时间。你看到的 composer show --outdated 或 composer show vendor/package 里显示的 time 字段,其实是该版本在 Packagist 上的发布时间,不是你机器上安装或更新的时间。
所以别指望靠这个判断“我上周有没有更新过 laravel/framework”——它回答不了这个问题。
查本地更新时间得看 vendor 目录的文件修改时间
最直接、最可靠的方式是检查 vendor/ 下对应包目录的最后修改时间。Composer 安装或更新时会写入文件,这个时间戳基本能反映你上次操作的时间(除非手动改过文件)。
-
ls -ld vendor/laravel/framework(Linux/macOS) -
dir vendor\laravel\framework(Windows cmd) - 如果用 Git 管理
vendor/(不推荐),可用git log -n 1 -- vendor/laravel/framework查提交时间
注意:vendor/ 下的文件时间可能被某些 IDE、杀毒软件或同步工具意外刷新,导致不准;但对绝大多数日常场景,它比任何元数据都实在。
想自动化查多个包的更新时间?写个简单脚本就行
Composer 没提供内置命令,但你可以用一行 shell 快速扫一遍常用包:
find vendor -maxdepth 2 -type d -name 'composer.json' -exec dirname {} \; | xargs -I{} sh -c 'echo "$(basename {}): $(stat -c "%y" {} 2>/dev/null | cut -d" " -f1)";' | sort说明:
- 只查
vendor/下二级目录(避免扫描太深),找含composer.json的包根目录 -
stat -c "%y"是 Linux 语法;macOS 要换成stat -f "%Sm" -t "%Y-%m-%d" {} - 输出格式为
package-name: 2024-05-22,按日期排序便于发现哪些包很久没动过
这个脚本不会误判,也不依赖 Packagist 数据,但它查的是“目录最后变更时间”,不是“Composer 记录的更新动作时间”——这两者在绝大多数 update 场景下是一致的。
别信 composer.lock 里的 time 字段
composer.lock 文件里每个包确实有个 time 字段,比如:
"time": "2024-05-20T14:22:33+00:00"
但这只是 Composer 写 lock 文件时,从 Packagist API 拉下来的版本发布时间,和你的本地操作毫无关系。即使你一年没跑 update,只要重生成 lock(比如改了 composer.json 后 install),这个时间也会被覆盖成最新版的发布日期。
所以拿它当更新时间用,等于把出厂日期当保养日期——看起来有依据,其实完全错位。
真正要确认某个包是不是最近更新的,盯住 vendor/ 目录的时间戳,再配合 git status vendor/(如果你真提交了 vendor)——其他所有间接方式,都容易漏掉关键上下文。










