Skip to content

🚀 你的第一次 Packagist 查询

5 分钟,用纯 Go 完成"搜索包 → 看详情 → 看公告 → 看统计"四个动作。不需要本机安装 PHP 或 Composer,全程走 Packagist REST API。

为什么从这里开始

Packagist API SDK 是个纯 Go 客户端,没有任何外部运行时依赖。它是感受 Composer Skills "类型化返回值"理念最轻量的入口——你不用配置环境,跑起来就能看到结构化结果。

第 1 步:创建客户端

pkg/client.NewComposerClient 接收一个 HTTP 超时时间,返回一个开箱即用的客户端。

go
c := client.NewComposerClient(30 * time.Second)

第 2 步:搜索包

SearchPackages(query, perPage, page) 返回 *domain.SearchResponse,里面有 Results 切片和 Total 总数。

第 3 步:获取包详情

GetPackage(name) 返回 *domain.ComposerPackageInfo,包含描述、版本、维护者等。

第 4 步:安全公告与统计

GetSecurityAdvisories() 拉取全站公告;GetStatistics() 返回总包数、总下载数。

完整可运行示例

把下面代码存为 main.gogo run main.go 即可。

go
package main

import (
	"fmt"
	"time"

	"github.com/scagogogo/composer-skills/pkg/client"
)

func main() {
	c := client.NewComposerClient(30 * time.Second)

	// 1️⃣ 搜索包
	results, err := c.SearchPackages("logging", 5, 1)
	if err != nil {
		panic(err)
	}
	fmt.Printf("🔍 搜索 logging,共 %d 个包,前 %d 个:\n", results.Total, len(results.Results))
	for _, r := range results.Results {
		fmt.Printf("   - %s: %s\n", r.Name, r.Description)
	}

	// 2️⃣ 获取包详情
	pkg, err := c.GetPackage("monolog/monolog")
	if err != nil {
		panic(err)
	}
	fmt.Printf("\n📦 %s\n   %s\n", pkg.Package.Name, pkg.Package.Description)

	// 3️⃣ 安全公告
	advisories, err := c.GetSecurityAdvisories()
	if err != nil {
		panic(err)
	}
	fmt.Printf("\n🔒 Packagist 共 %d 个包有安全公告\n", len(advisories.Advisories))

	// 4️⃣ 统计信息
	stats, err := c.GetStatistics()
	if err != nil {
		panic(err)
	}
	fmt.Printf("\n📊 总包数: %d | 总版本数: %d | 总下载: %d\n",
		stats.Totals.Packages, stats.Totals.Versions, stats.Totals.Downloads)
}

预期输出

🔍 搜索 logging,共 1234 个包,前 5 个:
   - monolog/monolog: Sends your logs to files, sockets...
   - ...
📦 monolog/monolog
   Sends your logs to files, sockets, inboxes, databases and various web services

🔒 Packagist 共 87 个包有安全公告

📊 总包数: 390000 | 总版本数: 3200000 | 总下载: 9876543210

进阶:分页与按标签搜索

SearchPackagespage 参数可翻页;想按标签过滤用 SearchPackagesByTags(tags, perPage, page),按类型过滤用 SearchPackagesByType(query, packageType, perPage, page)

只关心某个包?

直接用 c.GetPackage("vendor/name") 一步到位,不必先搜索。还可用 GetPackageStats 拉该包的逐版本下载量。

网络与限流

Packagist 是公共 API,请合理设置 perPage(建议 ≤ 100)并复用同一个 client 实例,避免短时间内大量请求。

下一步

基于 MIT 许可证发布