Composer不支持自动更新version字段,它仅作为静态元数据;可靠做法是Git标签与composer.json version对齐,通过CI/CD校验并注入版本,核心在Git和CI而非Composer。

Composer本身不支持自动更新版本号
Composer的version字段只是元数据,不会自增、不参与依赖解析,也不会被composer update或composer install修改。你手动改它,或者用脚本改它,Composer都只当它是静态字符串。想靠composer.json配置实现“提交就升版”,纯属误解。
用Git标签 + composer dump-autoload --classmap-authoritative配合语义化版本
实际项目中可靠的版本管理,是把version字段和Git标签对齐,再靠CI/CD流程强制校验。关键不是让Composer“自动改”,而是让它“只认可信版本”:
- 在
composer.json里写"version": "dev-main"(开发时)或留空(由composer install根据当前tag推断) - 发布时打带前缀的Git标签,如
v1.2.3,确保与composer.json中version一致 - CI中运行
git describe --tags --exact-match HEAD 2>/dev/null验证当前提交有精确tag,失败则中断发布 -
composer install --no-dev --optimize-autoloader会把tag名注入vendor/composer/installed.json,后续可用Composer\InstalledVersions::getVersion('your/package')读取
常见错误:用composer bump或第三方插件强行自增
这类做法看似省事,实则破坏语义化版本的契约:
-
composer-bump-plugin等工具会直接改composer.json里的version,但没同步打Git tag → 后续composer require可能拉到无对应tag的“幽灵版本” - 在CI中执行
composer bump patch后不git commit -m "bump"+git push --tags→ Packagist收不到新版本,别人composer update永远拉不到 - 把
version设成"1.0.*"或"dev-main"却未配置repositories类型为vcs→ Packagist拒绝收录,本地composer require失败并报错Could not find package your/name at any version
真正自动化的核心在Git和CI,不在Composer
Composer只负责消费版本,不负责生成版本。如果你需要每次merge到main就发v1.2.4这样的版本,该做的不是改composer.json,而是:
- 在GitHub Actions或GitLab CI里用
conventional-commits解析commit message,调用standard-version生成changelog并打tag - 用
git config --global user.name 'CI Bot'和token配置Git凭据,确保tag能push成功 - 在Packagist上勾选“Update automatically”,并确保webhook触发地址正确(常被忽略的是:私有GitLab需手动配webhook,Packagist不主动轮询)
- 检查
composer.json中的type字段是否为library或metapackage—— 若为project,Packagist会直接忽略,不会当作可require的包
版本号是不是“自动”的,取决于你的Git工作流是否闭环。Composer连个递增函数都没有,别指望它替你做决策。











