Composer 本身无 publish 命令,所谓自定义发布实为 shell/Makefile 封装的 Git tag 流程;必须确保 composer.json version 与 v1.2.3 格式 tag 严格一致,且仅通过 git tag + git push --tags 触发 Packagist 或私有仓库同步。

Composer 自定义命令如何绑定到 Git 标签发布流程
直接结论:Composer 本身不提供“发布标签”的命令,composer publish 这类操作并不存在;所谓“定制命令”实际是团队在 Git + Composer 工作流中,用 shell 脚本或 Makefile 封装的发布检查逻辑,最终落地靠 git tag 和 git push --tags。
常见错误现象是开发者执行 composer publish 报错 “Command 'publish' is not defined”,本质是误把第三方插件(如 composer-publish-plugin)当成了 Composer 原生能力。真正稳定可控的做法,是把版本校验、包一致性检查、Git 标签生成这三步串成一个可复用的脚本,而不是依赖某个易弃更的插件。
- 必须确保
composer.json中的version字段与即将打的 Git tag 完全一致(例如都为1.2.3),否则 Packagist 或私有仓库同步时会拒绝或覆盖失败 - 推荐用
make release VERSION=1.2.3这类显式传参方式,避免脚本自动读取composer.json版本导致语义混淆(比如 dev-main 分支误发正式版) - 脚本里要校验当前分支是否为
main或master,禁止在 feature 分支上打正式 tag
为什么不能跳过 Git tag 直接改 composer.json version 提交
因为 Packagist 和大多数私有 Composer 仓库(如 Satis、Private Packagist)只认 Git tag,不解析 commit 上的 composer.json 版本字段。你改了 version 并 git push,但没 git tag v1.2.3 && git push --tags,那这个版本根本不会出现在 composer require vendor/package 的可用列表里。
更隐蔽的问题是:如果团队多人同时开发,有人改了 composer.json 但没打 tag,另一个人又基于旧 commit 打了同名 tag,会导致 Composer 解析出两个“相同版本号但不同代码”的包,引发依赖不一致。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Git tag 是不可变锚点,
composer.json中的version只是人类可读提示,不是权威来源 - 私有仓库同步工具(如 Satis)默认只扫描 tag,除非显式配置
"branches": ["main"]—— 但这会让 dev 版本污染生产依赖树 - CI 流程中应强制要求:只有带
v[0-9]+.[0-9]+.[0-9]+格式 tag 的构建才触发 packagist 同步动作
企业级 tag 命名规范怎么和 Composer 的 stability flag 对齐
Composer 的稳定性判断(stable / beta / dev)完全取决于 tag 名称是否匹配正则 ^v?([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z.-]+))?$,且无破折号后缀才算 stable。所以 v1.2.3 和 1.2.3 都是 stable,但 v1.2.3-beta.1 就是 beta。
企业内部常犯的错是:用 v1.2.3-internal.1 表示灰度版本,结果 Composer 把它识别为 beta,导致 require 时必须显式写 "^1.2.3@beta",破坏语义化版本预期。
- 正式发布严格用
vX.Y.Z(带v前缀),这是 Packagist 推荐格式,也方便git describe解析 - 预发布版本统一用
vX.Y.Z-rc.N(如v2.0.0-rc.1),Composer 会正确识别为RC稳定性,且支持^2.0.0@rc这类约束 - 绝对不要在 tag 里塞 commit hash 或日期(如
v1.2.3-20240520),这会让 Composer 认为它是 unstable,require 时需加@dev
私有仓库同步失败时,第一个该查什么
不是看 Composer 命令,而是立刻执行:git ls-remote --tags your-private-repo-url。90% 的“发布后拉不到新版本”问题,根源是 tag 根本没推上去,或者推到了错误远程(比如推到了 fork 仓库而非主仓库)。
另一个高频盲区:私有仓库(如 Satis)配置里写了 "output-dir": "web",但 Web 服务器没把 web/packs/ 下的 JSON 文件暴露为可访问路径,导致 Composer 请求 https://repo.example.com/packs/vendor/package.json 返回 404,却误以为是包不存在。
- 确认 tag 存在后,再跑一次
composer clear-cache && composer show vendor/package -a,看输出里有没有刚发布的版本号 - 如果仍看不到,用
curl -I https://your-repo.com/packages.json检查 HTTP 状态码和Content-Type: application/json是否正常 - Satis 用户注意:
build命令默认只处理已知 tag,新增 tag 后必须重新运行php bin/satis build satis.json web/,不能只靠 webhook 自动触发(很多部署漏配)
composer.json 里 license 写错了。

















