Skip to content

📋 包列表

按供应商、类型或附加字段批量获取 Packagist 上的包名列表,以及获取流行包榜单。与 搜索 不同,列表方法返回的是包名集合(不走搜索打分),适合全量遍历、镜像同步、生态统计。

何时使用

  • 📋 全量遍历某个 vendor(如 symfony/* 下所有包)做依赖梳理。
  • 🏷️ 拉取某类 type 的所有包(如全部 composer-plugin)。
  • 🔄 镜像同步:用 ListPackagesWithData 一次性拿到包名 + 仓库 URL + 类型。
  • 📈 用 ListPopularPackages 生成热门包榜单。

数据模型

PackageListResponse

pkg/domain/package_list.go,对应 /packages/list.json(无 fields 时)。

go
type PackageListResponse struct {
    PackageNames []string `json:"packageNames"`
}
字段类型说明
PackageNames[]string包名列表(vendor/package

PackageListWithDataResponse / PackageData

对应 /packages/list.json?fields[]=...,带附加字段。

go
type PackageListWithDataResponse struct {
    Packages map[string]PackageData `json:"package"`
}

type PackageData struct {
    Type       string      `json:"type,omitempty"`
    Repository string      `json:"repository,omitempty"`
    Abandoned  interface{} `json:"abandoned,omitempty"`
}
字段类型说明
Packagesmap[string]PackageData键为包名,值为附加数据
PackageData.Typestring包类型(需在 fields 中请求 type
PackageData.Repositorystring仓库 URL(需请求 repository
PackageData.Abandonedinterface{}废弃标记:false/true,或字符串(推荐替代包名,需请求 abandoned

Abandoned 字段类型

Abandonedinterface{} 承载是因为 Packagist 返回值可能是布尔(false/true)也可能是字符串(推荐替代的包名)。使用时需做类型断言。

PopularPackagesResponse / PopularPackage

pkg/domain/popular_packages.go,对应 /explore/popular.json

go
type PopularPackagesResponse struct {
    Packages []PopularPackage `json:"packages"`
    Total    int              `json:"total"`
    Next     string           `json:"next,omitempty"`
}

type PopularPackage struct {
    Name        string `json:"name"`
    Description string `json:"description"`
    URL         string `json:"url"`
    Downloads   int    `json:"downloads"`
    Favers      int    `json:"favers"`
}
字段类型说明
Packages[]PopularPackage当前页流行包列表
Totalint流行包总数
Nextstring下一页 URL(无则空)
PopularPackage.Namestring包名
PopularPackage.Descriptionstring描述
PopularPackage.URLstringPackagist 页面 URL
PopularPackage.Downloadsint下载次数
PopularPackage.Faversint收藏数

ListPackages

📋 获取所有包名列表。对应 GET https://packagist.org/packages/list.json

签名

go
func (c *ComposerClient) ListPackages() (*domain.PackageListResponse, error)

参数

无。

返回值

类型说明
结果*domain.PackageListResponse含全量 PackageNames
错误errorHTTP 失败、非 200、JSON 解析失败时返回

示例

go
package main

import (
    "fmt"
    "log"
    "time"

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

func main() {
    c := client.NewComposerClient(120 * time.Second) // 全量列表较大,超时给足

    list, err := c.ListPackages()
    if err != nil {
        log.Fatalf("获取包列表失败: %v", err)
    }
    fmt.Printf("Packagist 共有 %d 个包\n", len(list.PackageNames))
    for i, name := range list.PackageNames {
        if i >= 5 {
            break
        }
        fmt.Println(" -", name)
    }
}

响应体很大

/packages/list.json 返回全量包名(数十万条,响应体几十 MB)。生产环境建议超时设到 120s 以上,或改用底层 Repository.List 配合代理;需要落盘则用 DownloadIndexToFile


ListPackagesByVendor

📋 获取指定供应商(vendor)下的所有包名。对应 GET https://packagist.org/packages/list.json?vendor={vendor}

签名

go
func (c *ComposerClient) ListPackagesByVendor(vendor string) (*domain.PackageListResponse, error)

参数

参数类型说明
vendorstring供应商名,如 symfonylaravel

返回值

类型说明
结果*domain.PackageListResponse该 vendor 下的包名列表
错误errorHTTP 失败、非 200、JSON 解析失败时返回

示例

go
list, err := c.ListPackagesByVendor("symfony")
if err != nil {
    log.Fatal(err)
}
fmt.Printf("symfony/* 下共 %d 个包\n", len(list.PackageNames))
for _, name := range list.PackageNames {
    fmt.Println(name)
}

vendor 与 package 名

Packagist 包名格式为 vendor/packagevendor 是斜杠前的部分。vendor=symfony 会返回所有 symfony/* 包。


ListPackagesByType

📋 获取指定类型的所有包名。对应 GET https://packagist.org/packages/list.json?type={type}

签名

go
func (c *ComposerClient) ListPackagesByType(packageType string) (*domain.PackageListResponse, error)

参数

参数类型说明
packageTypestring包类型,如 librarycomposer-pluginprojectmetapackage

返回值

类型说明
结果*domain.PackageListResponse该类型的包名列表
错误errorHTTP 失败、非 200、JSON 解析失败时返回

示例

go
list, err := c.ListPackagesByType("composer-plugin")
if err != nil {
    log.Fatal(err)
}
fmt.Printf("composer-plugin 类型共 %d 个包\n", len(list.PackageNames))

ListPackagesWithData

📋 获取包列表,并附带额外字段(仓库 URL、类型、废弃标记)。对应 GET https://packagist.org/packages/list.json?fields[]={field}

签名

go
func (c *ComposerClient) ListPackagesWithData(fields []string) (*domain.PackageListWithDataResponse, error)

参数

参数类型说明
fields[]string要返回的附加字段名列表,每个作为 fields[] 查询参数发出

可选字段值(参考 Packagist 文档):

字段说明
repository仓库 URL
type包类型
abandoned废弃标记(布尔或推荐替代包名)

返回值

类型说明
结果*domain.PackageListWithDataResponse包名 → 附加数据映射
错误errorHTTP 失败、非 200、JSON 解析失败时返回

示例

go
resp, err := c.ListPackagesWithData([]string{"repository", "type", "abandoned"})
if err != nil {
    log.Fatal(err)
}
for name, data := range resp.Packages {
    fmt.Printf("%s\n", name)
    fmt.Printf("  类型: %s\n", data.Type)
    fmt.Printf("  仓库: %s\n", data.Repository)
    if data.Abandoned != nil && data.Abandoned != false {
        fmt.Printf("  ⚠ 已废弃: %v\n", data.Abandoned)
    }
}

字段选择

请求越多 fields,响应体越大。只取需要的字段。注意:不带 fields 时端点返回的是 packageNames 数组(PackageListResponse),带 fields 时返回的是 package 映射(PackageListWithDataResponse)——两种响应结构不同,SDK 用不同类型解析。


ListPopularPackages

📋 获取流行包榜单。对应 GET https://packagist.org/explore/popular.json?per_page={n}

签名

go
func (c *ComposerClient) ListPopularPackages(perPage int) (*domain.PopularPackagesResponse, error)

参数

参数类型说明
perPageint每页条数,直接拼为 per_page 查询参数

返回值

类型说明
结果*domain.PopularPackagesResponsePackagesTotalNext
错误errorHTTP 失败、非 200、JSON 解析失败时返回

示例

go
res, err := c.ListPopularPackages(100)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("流行包共 %d 个,当前页 %d\n", res.Total, len(res.Packages))
for i, p := range res.Packages {
    fmt.Printf("%2d. %s (下载 %d, 收藏 %d)\n", i+1, p.Name, p.Downloads, p.Favers)
}

进阶

五个列表方法对比

方法返回维度适用
ListPackages包名数组全量全量遍历
ListPackagesByVendor包名数组按 vendor厂商维度梳理
ListPackagesByType包名数组按 type类型维度梳理
ListPackagesWithData包名 → 附加字段全量 + 字段镜像同步(带仓库 URL)
ListPopularPackages流行包详情榜单热门包展示

与搜索的区别

搜索方法/search.json,按相关性打分并分页;列表方法走 /packages/list.json,返回的是无序包名集合,不分页(除 ListPopularPackages)。要全量数据用列表,要「按关键词找最相关的」用搜索。

🔗 相关

基于 MIT 许可证发布