composer fund 是 Composer 2.2+ 内置只读命令,仅从 vendor/ 中已安装包的 composer.json 顶层 funding 字段提取并展示赞助链接;无输出通常因包未声明该字段、格式错误(如大小写不符或位置不对)或未实际安装。

composer fund 不是支付工具,也不是项目管理命令——它只是一个本地只读扫描器,只做一件事:从你 vendor/ 目录下已安装包的 composer.json 文件里,提取顶层 funding 字段并格式化输出。
如果你运行后什么都没看到,不是命令坏了,大概率是依赖包根本没填这个字段。
为什么 composer fund 没输出任何链接?
最常见原因就三个:
-
funding字段必须由包作者手动写进自己项目的composer.json顶层,不能放在extra或其他嵌套位置 - 字段名严格区分大小写:
funding有效,Funding、fundingUrl、fund都无效 - 只有已成功安装进
vendor/的包才会被扫描;require-dev里的包、用--no-install跳过的、或 symlink 过的目录可能被跳过
验证方式很简单:直接查源文件。比如想确认 guzzlehttp/guzzle 是否支持,执行:
cat vendor/guzzlehttp/guzzle/composer.json | grep -A 5 funding
如果输出为空,说明作者没配,或者配错了位置。
funding 字段怎么写才被 composer fund 识别?
格式必须是数组,每个元素含小写的 type 和完整 HTTPS url:
"funding": [
{"type": "github", "url": "https://github.com/sponsors/guzzle"},
{"type": "tidelift", "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle"}
]
注意这些细节:
-
type值必须小写,官方推荐值包括:github、opencollective、patreon、tidelift、ko_fi等 -
url必须是完整可访问的 HTTPS 链接,https://github.com/sponsors/xxx可以,/sponsors/xxx或短链不行 - 字段写在你自己项目的
composer.json里无效——composer fund只扫vendor/中的包
点击输出的链接会发生什么?
什么都不会经过 Composer:
- 终端是否支持点击跳转,完全取决于你的终端环境(iTerm2、Windows Terminal 通常支持
Ctrl+Click/Cmd+Click) - 纯文本环境(如 CI 日志、tmux 默认配置)只显示文本,需手动复制粘贴
- 链接直连第三方平台(GitHub Sponsors、Open Collective),Composer 不代理、不校验、不记录
- 没有登录状态检查:哪怕你没登录 GitHub,点击后也会跳到登录页,不会报错或静默失败
真正容易被忽略的是:这个命令只反映“谁留了入口”,不反映“谁更需要支持”。很多关键但小众的库(比如某个 parser 或 polyfill)至今没配 funding,你每天都在用,却永远不会出现在 composer fund 列表里。











