Skip to content

🚀 GetPackageChanges

获取 Packagist 包元数据的增量变更记录,用于自建镜像的增量同步。

何时使用

🛠️ 自建 Packagist 镜像,避免每次全量拉取;🔍 监控哪些包被新增 / 更新 / 删除;⏱️ 需要可断点续传、按时间游标推进的同步任务。

签名

go
func (c *ComposerClient) GetPackageChanges(ctx context.Context, since int64) (*domain.ChangeTrackingResponse, error)

参数

参数类型说明
ctxcontext.Context上下文,用于超时与取消
sinceint64增量游标(Unix 时间戳);传 0 返回当前时间戳但 Actions 为空,用于首次获取游标

返回值

类型说明
结果*domain.ChangeTrackingResponseTimestamp(下次游标)与 Actions 变更列表,Typeupdate/delete
错误errorHTTP 失败、非 200、JSON 解析失败时返回

对应端点:GET https://packagist.org/metadata/changes.json?since={timestamp}

示例

go
package main

import (
	"context"
	"fmt"
	"log"
	"time"

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

func main() {
	c := client.NewComposerClient(30 * time.Second)
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	// 首次同步:拿一个起始游标
	resp, err := c.GetPackageChanges(ctx, 0)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("起始游标: %d\n", resp.Timestamp)

	// 下次用这个游标做增量
	resp, err = c.GetPackageChanges(ctx, resp.Timestamp)
	if err != nil {
		log.Fatal(err)
	}
	for _, a := range resp.Actions {
		fmt.Printf("[%s] %s @ %d\n", a.Type, a.Package, a.Time)
	}
	fmt.Printf("下次游标: %d\n", resp.Timestamp)
}

进阶

增量同步模式

since=0 时只返回当前 Timestamp 而不返回历史变更。正确做法是:① 先用 since=0 拿到起始 Timestamp 并持久化;② 此后每次用上次的 Timestamp 作为 since,处理返回的 Actions,再保存新的 Timestamp。若 since 无效,响应 Error 字段会有错误说明。

基于 MIT 许可证发布