gitlink-cli/doc/reading_notes/1.txt

83 lines
8.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ctx 就是 *common.RuntimeContext。一句话它是每个 Shortcut
命令的"工具箱"所有能力发API请求、读参数、输出结果都挂在这个对象上。
---
它长什么样shortcuts/common/types.go:41-50
type RuntimeContext struct {
Client *client.Client // ← 发 HTTP 请求的客户端
Owner string // ← --owner 的值(如 "zzx-coder"
Repo string // ← --repo 的值(如 "gitlink-cli"
Format string // ← --format 的值("json" / "table" / "yaml"
CommandName string // ← 当前命令名(如 "wiki +delete"
Args map[string]string // ← 所有 flag 的键值对(如 {"title":"Home","dry-run":"false"}
GatewayBaseURL string // ← Wiki/Webhook网关地址跟标准API不同
GatewayHTTPClient *http.Client // ← 网关专用 HTTP 客户端nil 则自动创建)
}
---
它怎么创建出来的types.go:53-80
你敲 gitlink-cli wiki +delete --title "Home" 时:
第1步cobra 解析命令行 → flagValues = {"title": "Home"}
第2步runner.go:34 → NewRuntimeContext(flagValues, "wiki +delete")
第3步NewRuntimeContext 内部:
→ client.New() // 读取配置文件,拿到 BaseURL + 带 auth 的 HTTP Client
→ 读取全局 flag // cmdutil.Owner, cmdutil.Repo, cmdutil.Format
→ 组装成 RuntimeContext // 把所有东西塞进去
第4步传给 s.Run(ctx) // 你的业务逻辑拿到这个 ctx
---
它上面的方法(你可以直接用 ctx.XXX() 调用的)
┌──────────────────────────────────────┬───────────────────────────────────┬──────────────────────────────────────┐
│ 方法 │ 做什么 │ 例 │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.Arg("title") │ 读用户传入的 flag 值 │ "Home" │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.RequireArg("title", "提示") │ 读必填参数,为空就报 CLIError │ 同上,但自动校验 │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.CallAPI("GET", path, body) │ 调 GitLink 标准 API │ ctx.CallAPI("GET", "/users/me", nil) │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.CallAPIWithQuery("GET", path, │ 带查询参数的 API │ ctx.CallAPIWithQuery("GET", │
│ query) │ │ "/issues", q) │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.Output(env) │ 输出 API 响应(自动选 │ ctx.Output(env) │
│ │ json/table/yaml │ │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.OutputData(data) │ 包装数据成成功 envelope 再输出 │ ctx.OutputData(myStruct) │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.ResolveOwnerRepo() │ 从 git remote 自动推断 owner/repo │ 没传 --owner 时自动填充 │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.RepoPath() │ 返回 "/owner/repo" 字符串 │ "/zzx-coder/gitlink-cli" │
├──────────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┤
│ ctx.IsDryRun() │ 判断用户是否传了 --dry-run │ true / false │
└──────────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────────┘
---
一条命令里 ctx 的完整生命周期
以 wiki +delete --title "Home" 为例:
1. runner.go:20-31 收集 flag
flagValues = {"title": "Home"}
2. runner.go:34 创建 ctx
ctx = NewRuntimeContext({"title":"Home"}, "wiki +delete")
→ ctx.Client = 带认证的HTTP客户端BaseURL = https://gitlink.org.cn/api
→ ctx.Owner = "zzx-coder"(从 git remote 或 --owner 来的)
→ ctx.Repo = "gitlink-cli"
→ ctx.Format = "table"(默认值)
→ ctx.Args = {"title": "Home"}
3. runner.go:60 调用你的业务逻辑
err = s.Run(ctx)
4. wiki.go:747 你的 Run 函数里用 ctx
title, _ = ctx.RequireArg("title", ...) // → "Home"
projectID, _ = resolveProjectID(ctx) // → ctx 传进子函数
body = {..., "pageName": actualPageName}
callWikiAPI(ctx, "DELETE", ..., body) // → ctx 用于构造网关 Client
ctx.OutputData(result) // → ctx.Format 决定输出格式
---