composer 没有 funding 命令,官方仅短暂支持过 composer fund(单数),但 2.7+ 版本已移除;当前最可靠方式是 composer show,它自动读取包仓库的 .github/funding.yml 并显示资助链接。

composer fund 命令到底有没有?别被名字骗了
Composer 没有 funding 命令,也不存在 composer funding;官方唯一支持的是 composer fund(注意是单数 fund),但它在 Composer 2.7.x 及之后版本中已被移除或未定义——执行会报错:Command "funding" is not defined 或 Command "fund" is not defined。这不是你装错了,是它真没了。
- Composer 2.2–2.6.x 确实短暂提供过
composer fund,但行为极不稳定:只读vendor/*/composer.json中的funding字段,且要求依赖已完整安装、字段格式严格、Packagist 缓存同步及时 - 从 2.7 开始,该命令被官方弃用,文档中已删除,CLI 不再注册
- 如果你看到别人跑出
composer fund输出,大概率是他们卡在 2.5.x 或用了自定义插件,不是通用能力
真正能用的:composer show + .github/FUNDING.yml
composer show 是目前最可靠、全版本兼容(≥2.2)的方式,但它不靠命令行开关,而是自动识别包仓库根目录下的 .github/FUNDING.yml 文件——这个文件由 GitHub 平台驱动,和 Composer 无关,但 Composer 会主动读取并追加到输出末尾。
- 运行
composer show monolog/monolog,若该包仓库存在有效的.github/FUNDING.yml,你会在输出底部看到类似:funding: [github] https://github.com/sponsors/Seldaek - 这个机制不依赖包作者改
composer.json,只要他们开了 GitHub Sponsors 并提交了 FUNDING.yml,就自动生效 - 注意:
composer show默认显示 Packagist 缓存的元数据,不是本地vendor里的文件;如需查本地修改(比如你 fork 后加了 funding),得加-s参数:composer show -s monolog/monolog
手动查 funding 字段?别只看 vendor/composer.json
很多教程让你直接翻 vendor/{vendor}/{package}/composer.json 找 funding 字段,这容易误判——因为 Composer CLI 显示的 funding 来源有两个,且优先级不同:
- 高优先级:包仓库的
.github/FUNDING.yml(composer show会读) - 低优先级:包自己的
composer.json根级funding数组(必须是[{"type":"github","url":"..."}]格式,写错位置、大小写、URL 缺协议都会静默忽略) - 常见坑:
funding写在extra里、写成Funding、URL 是相对路径(如sponsors/foo)→ Composer 完全不认 - 验证是否生效:去 Packagist 页面打开对应包,看右栏 “Funding” 是否有链接——那里显示的是 Packagist 抓取的结果,比本地文件更反映真实可见性
想批量查所有依赖的资助入口?脚本比命令更靠谱
别指望 composer fund 自动递归扫描或生成点击链接——它连 --dev 参数都不稳定。真要批量查,不如写个两行脚本解析 vendor/composer/installed.json:
jq -r '.packages[] | select(.funding != null) | "\(.name) \(.funding[0].url)"' vendor/composer/installed.json
但这只读 composer.json 里的字段,漏掉 .github/FUNDING.yml。更全的做法是结合 GitHub API 查仓库是否存在 .github/FUNDING.yml,不过这就超出 Composer 职责了。
最常被忽略的一点:资助信息是否“可见”,根本不由你本地的 Composer 版本或命令决定,而取决于包作者是否提交了 .github/FUNDING.yml、是否在 GitHub 仓库设置里启用了 Sponsors、以及 Packagist 是否已完成同步——三者缺一不可。你敲再多遍 composer fund,它也不会变出来。










