Composer官方不支持forum或docs等自定义链接字段,Packagist仅识别support下的email、issues、source、rss、chat五个预定义键,文档链接应使用homepage字段,它会显示在包页顶部右侧。

Composer 本身不提供“支持论坛”或“文档链接”的官方字段,composer.json 中没有 support-forum 或 docs-url 这类标准键。你看到的某些包显示了论坛或文档链接,其实是通过非标准字段(如自定义键)或第三方平台(Packagist)的扩展能力实现的,不是 Composer 解析或使用的原生配置。
Packagist 支持的 support 字段只认固定子键
Packagist 在解析 composer.json 时,会读取 support 对象,但**仅识别以下预定义子键**:email、issues、source、rss、chat。它会忽略其他任意字段(比如 forum、docs、help),也不会在页面上展示。
-
issues:指向 GitHub/GitLab 的 issue 页面(如"https://github.com/user/repo/issues") -
source:指向源码仓库(如"https://github.com/user/repo"),Packagist 用它做自动同步 -
chat:通常填 Slack/Discord 入口 URL(如"https://discord.gg/abc123") -
email:仅用于联系,不公开渲染为链接(Packagist 不展示)
如果你硬加上 "forum": "https://example.com/forum",它不会报错,但 Packagist 页面上完全不可见。
想让文档链接出现在 Packagist 页面?只能靠 homepage
Packagist 唯一额外展示的链接字段是 homepage —— 它会以 “Homepage” 标签显示在包详情页顶部右侧。这是最接近“文档入口”的合法方式:
{
"name": "vendor/package",
"description": "A useful package",
"homepage": "https://vendor.github.io/package/",
"support": {
"issues": "https://github.com/vendor/package/issues",
"source": "https://github.com/vendor/package"
}
}
注意:homepage 不限于官网,也可以直接指向文档站点(如 Read the Docs、VuePress、Docusaurus 构建的页面)。只要 URL 可访问,Packagist 就会渲染它。
- 别填 GitHub README 链接(如
https://github.com/.../blob/main/README.md)—— 渲染效果差,且移动端体验糟糕 - 避免使用短链或跳转服务(如 bit.ly),Packagist 不校验,但用户点击可能被拦截或标记为不安全
- 如果项目有多个目标链接(文档 + 论坛 + 演示站),优先把最通用的放
homepage,其余写进README.md并确保它在 GitHub/GitLab 仓库首页可见
想在 composer install 时提示用户去哪看文档?用 scripts + post-install-cmd
虽然无法让 Composer 自动识别“文档链接”,但你可以利用安装后钩子,在终端里主动提醒:
{
"scripts": {
"post-install-cmd": [
"@php -r \"file_put_contents('php://stdout', \"\\n? Docs: https://vendor.github.io/package/\\n\");\""
]
}
}
这样每次运行 composer install 或 composer update,终端末尾就会输出一行提示。适用于团队内部工具包或 SDK 类项目。
- 不要用
echo直接写 shell 命令(如"echo 'Docs: ...'"),Windows CMD 下可能乱码或失败 - 避免在
post-autoload-dump里做这事 —— 它触发更频繁(比如改了代码就重跑),容易干扰 CI/CD 日志 - 如果提示信息较长,建议改用独立 PHP 脚本(如
bin/composer-notice.php),便于测试和复用
真正起作用的只有 homepage 和 support.* 的那几个白名单键;其余字段只是 JSON 合法但无意义。别在 composer.json 里堆砌自定义链接字段,它们既不被解析,也不被展示,还可能误导协作者以为“这样写就生效了”。










