git tag 必须带 v 前缀,因 packagist 仅将 v1.0.0 等格式识别为稳定版本;不带 v 的 tag 易被误判为 dev 分支,导致 composer require 时不可见。

打 Git tag 为什么必须带 v 前缀?
Packagist 默认只把形如 v1.0.0、v2.1.3 的 tag 当作稳定版本识别;不带 v(比如 1.0.0)虽然偶尔能被识别,但属于非标准行为,依赖 Packagist 内部宽松匹配逻辑,极不稳定。
- 用户执行
composer require vendor/name时,默认只会拉取stable版本,没v前缀的 tag 很可能被归为dev分支别名,压根不会出现在可用版本列表里 - GitHub Release 页面能显示它,不代表 Packagist 能索引它——这是两个系统,Packagist 只认自己定义的语义化版本格式
- 本地测试时可用
composer require vendor/name:dev-main临时绕过,但这不是发布,只是调试手段
composer.json 里哪些字段一错就发布失败?
不是所有字段都“可选”。Packagist 第一次抓取时会做硬校验,缺或错就直接拒绝索引,页面显示 Invalid package information 或 Repository not found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
name必须是vendor/name格式,全小写、只含字母数字和短横线:myorg/http-client✅,MyOrg/HttpClient❌,myorg_http_client❌ -
autoload缺失或映射错误,会导致用户require成功但运行时报Class not found—— Composer 不报错,只是默默不加载 -
type虽然有默认值,但显式写成"type": "library"能避免某些平台(如 Laravel Nova)自动注册逻辑失效 -
description和license不影响安装,但缺失会让 Packagist 页面警告,且很多公司合规扫描工具会拒用无协议包
Webhook 配了却没更新?先查这三处
很多人打完 git push --tags 就等 Packagist 自动刷新,结果几小时过去页面还是旧的。这不是缓存问题,是 Webhook 根本没触发成功。
- GitHub Webhook 的
Payload URL必须是https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/api/github(注意不是 packagist.org 域名) - Content type 必须选
application/json,不是application/x-www-form-urlencoded - Trigger events 必须勾选
Tag push events—— 仅勾Just the push event是不够的,因为 tag 推送是独立事件类型 - 验证是否生效:进 GitHub 仓库 → Settings → Webhooks → 点刚配的 hook → 查
Recent Deliveries,状态码是200才算通
本地验证新版本能不能用,别跳过这一步
别等别人提 issue 说 Class 'Vendor\Class' not found 才发现 autoload 没对上。每次改完 composer.json 或代码结构,必须本地走一遍最小闭环。
- 新建空目录:
mkdir test && cd test && composer init -n - 临时装开发版:
composer require vendor/name:dev-main(确保远程已git push) - 写个简单测试文件,
require 'vendor/autoload.php'后尝试 new 一个类,看是否真能加载 - 如果失败,立刻运行
composer dump-autoload -o强制重生成映射,再试——Windows 下反斜杠漏写双写、路径末尾少\都会导致 PSR-4 失效
composer.json 和 Git tag 工作。最常卡住的地方从来不是流程,而是 name 字段手抖多打了大写字母,或是 git push 忘了加 --tags。










