Skip to content

💰 资金

列出项目中可捐赠(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"`
}
字段类型说明
Namestring包名,如 symfony/console
URLs[]string资金链接列表(GitHub Sponsors、Patreon 等)
Fundingbool是否声明了资金支持

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"`
}

方法签名

方法签名说明
💰 Fundfunc (c *Composer) Fund() (string, error)composer fund 文本输出
📋 FundWithJSONfunc (c *Composer) FundWithJSON() ([]FundingInfo, error)composer fund --format=json 并解析
🎯 FundWithPackagefunc (c *Composer) FundWithPackage(packageName string) (string, error)查询单个包的资金信息
🔗 GetFundingURLsfunc (c *Composer) GetFundingURLs() (map[string][]string, error)包名 → 资金 URL 映射
❓ HasFundingfunc (c *Composer) HasFunding() (bool, error)项目是否存在可捐赠包
⚙️ FundWithOptionsfunc (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 不要混淆

FundingInfofund.go)来自 --format=json,含 URLs 切片;FundInforesult_types.go)来自 ParseFundOutput 对文本输出的解析,含 Type 字段。两者字段不同,请按需选用。

基于 MIT 许可证发布