💰 资金
列出项目中可捐赠(funding)的包及其资金链接,方便你支持开源维护者。
Composer 的 composer fund 命令会读取每个已安装包 composer.json 里的 funding 字段并汇总展示。Composer Skills 把它封装为四个层次:原始文本输出、JSON 结构化列表、按包查询、以及布尔判断「项目是否有任何资金条目」。
何时使用
- 💖 在你的 CLI 工具或仪表盘里展示「本项目依赖了哪些可赞助的开源包」。
- 📊 生成项目依赖报告时附带资金链接,提醒团队关注上游维护者。
- 🤝 决定是否在 CI 末尾打印一条「考虑赞助」提示——用
HasFunding做条件判断。 - 🎯 只查某个特定包(如
symfony/console)的资金信息。
结构化类型
FundingInfo
FundWithJSON 返回的元素,对应 composer fund --format=json 数组中的一项。
go
type FundingInfo struct {
Name string `json:"name"`
URLs []string `json:"urls"`
Funding bool `json:"funding"`
}| 字段 | 类型 | 说明 |
|---|---|---|
Name | string | 包名,如 symfony/console |
URLs | []string | 资金链接列表(GitHub Sponsors、Patreon 等) |
Funding | bool | 是否声明了资金支持 |
FundInfo / FundResult
由解析层 ParseFundOutput 使用(文本格式解析),与上面的 FundingInfo 区分。
go
type FundInfo struct {
Package string `json:"package"`
Type string `json:"type,omitempty"` // "github", "patreon", "tidelift" 等
URL string `json:"url,omitempty"`
}
type FundResult struct {
Funds []FundInfo `json:"funds,omitempty"`
}方法签名
| 方法 | 签名 | 说明 |
|---|---|---|
| 💰 Fund | func (c *Composer) Fund() (string, error) | composer fund 文本输出 |
| 📋 FundWithJSON | func (c *Composer) FundWithJSON() ([]FundingInfo, error) | composer fund --format=json 并解析 |
| 🎯 FundWithPackage | func (c *Composer) FundWithPackage(packageName string) (string, error) | 查询单个包的资金信息 |
| 🔗 GetFundingURLs | func (c *Composer) GetFundingURLs() (map[string][]string, error) | 包名 → 资金 URL 映射 |
| ❓ HasFunding | func (c *Composer) HasFunding() (bool, error) | 项目是否存在可捐赠包 |
| ⚙️ FundWithOptions | func (c *Composer) FundWithOptions(options map[string]string) (string, error) | 自定义选项 |
示例
列出所有可捐赠包及链接
go
package main
import (
"fmt"
"log"
"github.com/scagogogo/composer-skills/pkg/composer"
)
func main() {
comp, err := composer.New(composer.DefaultOptions())
if err != nil {
log.Fatalf("初始化失败: %v", err)
}
urls, err := comp.GetFundingURLs()
if err != nil {
log.Fatalf("获取资金链接失败: %v", err)
}
for pkg, links := range urls {
fmt.Printf("📦 %s\n", pkg)
for _, u := range links {
fmt.Printf(" -> %s\n", u)
}
}
}用 JSON 拿到完整结构
go
infos, err := comp.FundWithJSON()
if err != nil {
log.Fatal(err)
}
for _, info := range infos {
if info.Funding {
fmt.Printf("%-30s %d 个资金链接\n", info.Name, len(info.URLs))
}
}条件打印赞助提示
go
has, err := comp.HasFunding()
if err != nil {
log.Fatal(err)
}
if has {
fmt.Println("💖 本项目依赖了可赞助的开源包,运行 `composer fund` 查看详情")
}查询单个包
go
out, err := comp.FundWithPackage("symfony/console")
if err != nil {
log.Fatal(err)
}
fmt.Println(out)用 FundWithOptions 指定格式
go
out, err := comp.FundWithOptions(map[string]string{
"format": "json",
"no-dev": "",
})
if err != nil {
log.Fatal(err)
}
fmt.Println(out)进阶
HasFunding 的判断逻辑
HasFunding 执行 composer fund --format=text,当输出不含字符串 "No funding" 时返回 true。这是基于 Composer 文案的行为约定,未来 Composer 改变措辞可能影响判断。
两个 FundInfo 不要混淆
FundingInfo(fund.go)来自 --format=json,含 URLs 切片;FundInfo(result_types.go)来自 ParseFundOutput 对文本输出的解析,含 Type 字段。两者字段不同,请按需选用。