time 不是 composer.json 的合法字段,官方 Schema 不支持;其值实际来自 Git tag 的 committer date,由 Packagist 在发布时自动提取并展示。

composer.json 中根本没有 time 字段
直接说结论:time 不是 composer.json 的合法字段,官方 Schema 明确不支持。你在项目根目录的 composer.json 里手动加 "time": "2024-06-01T00:00:00Z",composer validate 会报错,composer install 也不会读取或使用它。
那发布时间到底存在哪儿?
Composer 自身不管理“项目发布时间”,它只关心包的「版本快照」和「发布时刻的元数据」——这些信息由 Packagist(或私有仓库)在你执行 composer publish(实际是 git push + webhook 触发)时,从 Git 标签(tag)的提交时间自动提取并存入仓库索引。
- 你打一个 Git tag:
git tag -a v1.0.0 -m "Release v1.0.0" && git push origin v1.0.0 - Packagist 收到通知后,解析该 tag 对应的 commit,读取
git show -s --format=%cI v1.0.0输出的时间(即 committer date) - 这个时间最终显示在 Packagist 页面的 “Published” 列,也出现在
composer show vendor/package的输出里
想在本地控制或伪造发布时间?别硬改 composer.json
强行在 composer.json 加 time 不仅无效,还会导致 CI/CD 流程中 composer validate --strict 失败。真有定制需求,只有两个合规路径:
-
改 Git 提交时间:用
git commit --date="2024-06-01 12:00:00"重写 tag 对应的 commit(需 force-push,慎用于共享分支) -
用私有仓库自定义元数据:如 Satis 或 Private Packagist,可在其配置中注入额外字段(但下游
composerCLI 仍不会读time,仅限页面展示)
注意:composer.json 的 time 字段从未被任何 Composer 版本实现过,网上部分教程是混淆了 Packagist API 返回的 time(来自 Git)和本地配置文件。
真正该关注的、和时间相关的字段是 version 和 stability
用户感知的“发布时间”本质是版本生命周期的起点,而 Composer 依赖的是语义化版本 + 稳定性标识来决定安装行为:
{
"name": "myorg/myapp",
"version": "1.0.0",
"type": "project",
"minimum-stability": "stable",
"prefer-stable": true
}
其中:version 字段仅在开发模式下(无 VCS)才被 Composer 读取;一旦项目有 Git 远程且打了 tag,version 就被忽略——真实版本号和发布时间全部以 Git tag 为准。这也是为什么删掉 composer.json 里的 version 反而是推荐做法。










