惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

Go 编程语言

做了一个持续同步官方的 A Tour of Go 中文版,也逐渐扩展成了多语言项目 - V2EX WorkBuddy + 企业微信 有人用过吗? - V2EX 业务系统开发语言从 PHP / Python 转向 Go 如何实现数据的存储 - V2EX [2026 最新] Go 1.27 泛型方法完全解读 - V2EX Go 后台接入 SSO 后,本地用户表应该怎么退? - V2EX clbtransport - 自带负载均衡的 http.Transport 简易替代 - V2EX 基于 go+react 开发的一款可私有化部署、任务驱动的代码托管平台 iForge - V2EX 分享一个还在 RC 阶段的项目:把 C 编译成不依赖 cgo 的 Go package - V2EX [工业边缘网关] EdgeX 更新啦,增加了 MCP,可以被 AI 接管了,可以让 AI 控制物理世界啦 [工业边缘网关] EdgeX 更新啦 上线了官网 顺便更新版本 v0.10.0 有了 Agent,后台脚手架是该退场,还是变成约束层? 强兼 Claude Code:左 DeepSeek V4,右 Kimi K3 构建时自动注入版本号:从 Git tag 到 Go 可执行文件 [边缘计算] 想借助 AI 来开发 边缘网关接入 AI 解决设备通信 不知道有没有需求 [Go]工业边缘计算网关 edgex 业余时间独立开发 持续更新半年咯 求个 star eget:不用等中央仓库,直接安装 GitHub 和任意下载站的工具 gookit/gcli v3.8:新增支持共享选项、文档生成和参数重排 V2EX 我开源了一款极简的 P2P 文件传输与 VPN 工具 (Win/Mac/ Linux /Android) 用 Go gRPC 信令对接 Android WebRTC:大家一般怎么划分网关和客户端边界? 在服务端用 Pion + FFmpeg + RNN 做 WebRTC 通话降噪,值得吗? 这两种 lint 报错场景, v 友们一般怎么处理 tikrok 的部分来时路 tikrok 第 7 代微服务重构: Golang 微服务 grpc 接口与服务实现隔离方案 写了个 Go 库:在 TCP 应用协议开始前做认证,也支持端口敲门 Tikrok v6.0 新的生产级架构,成本不变,但是部署复杂略有增加 go 打包的二进制程序怎么反编译 [边缘计算开源] 工业数据采集网关 版本更新 用 golang 写了,一套面向个人音乐资产的本地优先音乐系统 做了个 Go 的 MCP Server 框架,一行代码把 Gin API 接入 AI
gookit/gcli v3.5.0 发布 - 简单易用、功能丰富的 Go 命令行...
jxia · 2026-06-23 · via Go 编程语言

gookit/gcli v3.5 更新:自 v3.3.1 以来的改动汇总

gookit/gcli 是一个用 Go 编写的命令行应用与工具库。 本文汇总了从 v3.3.1 到最近发布的 v3.5(包含 v3.4 周期)的主要改动。这次更新主要集中在开发体验优化和底层健壮性修复上。

如果你在用 Go 写 CLI 工具,这次更新里有几个比较实用的功能。下面直接看重点。

核心更新概览

  • Shell 自动补全:支持零注册生成及动态补全模式( bash / zsh / PowerShell )。
  • 命令中间件:通过 Command.Use() / App.Use() 处理鉴权、日志等通用逻辑。
  • 帮助信息分组:使用 Category 对命令和选项进行分类展示。
  • 结构体绑定优化:新增 field 标签规则,支持匿名嵌套结构体自动展开。
  • 交互式收集:缺值时可通过 Question 自动提示输入。
  • POSIX 短选项合并:支持 -aux 拆分为 -a -u -x
  • 健壮性修复:panic 处理优化、help 命令行为修正等。
  • 少量破坏性变更(文末附迁移指南)。

1. Shell 自动补全改进

以前生成补全脚本需要硬编码命令和选项,新增命令后得重新生成。从 v3.5 开始,GCli 改进了这一流程。

不需要再手动注册 genac 命令,直接使用内置全局选项即可生成静态脚本:

# 为你的 shell 生成补全脚本,然后 source 它
myapp --gen-completion bash > myapp.bash
source myapp.bash

# zsh / PowerShell 同样支持
myapp --gen-completion zsh  > _myapp
myapp --gen-completion pwsh > myapp.ps1

此外,新增了动态补全模式。默认生成的脚本不再硬编码名称,而是在补全时通过内置的 --in-completion 选项动态调用你的程序获取候选项。以后新增命令,Tab 补全立即生效。

对于选项的取值,也可以通过 Choices 设置候选列表:

c.StrOpt2(&format, "format", "output format",
    gflag.WithChoices("json", "yaml", "table"))
// 输入 `--format <Tab>` 会提示: json  yaml  table

2. 命令中间件

如果需要在执行命令前做鉴权或记录日志,又不想把代码塞进每个命令里,可以使用中间件。

通过 Use() 注册的处理器会按顺序在命令主函数 Func 之前执行。如果某个处理器返回 error ,执行链会中止,错误向上传递。

// 命令级中间件
cmd.Use(func(c *gcli.Command, args []string) error {
    if os.Getenv("TOKEN") == "" {
        return c.NewErrf("missing TOKEN env")
    }
    return nil // 返回 nil 继续执行链
})

// 应用级中间件:在每个命令执行前生效
app.Use(func(c *gcli.Command, args []string) error {
    gcli.Debugf("running command: %s", c.Name)
    return nil
})

Command.Use()App.Use() 都返回接收者本身,支持链式调用。未使用中间件的代码行为与之前完全一致。

3. 帮助信息分组

当应用的命令和选项变多时,帮助信息会显得杂乱。现在可以通过设置 Category 字段将它们归类到带标题的分组中。

// 命令分组
app.Add(&gcli.Command{Name: "migrate", Desc: "run db migrate", Category: "database"})
app.Add(&gcli.Command{Name: "serve",   Desc: "start http server"}) // 默认分组

// 选项分组
cmd.StrVar(&dsn, &gcli.CliOpt{Name: "db-dsn", Desc: "database dsn", Category: "database"})
cmd.StrOpt2(&port, "port", "bind port", gflag.WithCategory("network"))

分组按首次出现的顺序排列,组内条目按名称排序。未设置分类时,输出格式与旧版相同。

4. 结构体绑定优化

FromStruct 新增了第三种标签规则(TagRuleField),并支持自动展开匿名嵌套结构体。

现在支持的三种规则:

  • gcli.TagRuleNamed(默认):flag:"name=int0;shorts=i;required=true;desc=message"
  • gcli.TagRuleSimpleflag:"desc;required;default;shorts"
  • gcli.TagRuleField(新增):使用字段名的 SnakeCase 作为选项名,元数据从独立的 tag 键读取。
type commonOpts struct {
    Verbose bool `flag:"v" desc:"enable verbose output"`
}

type demoOpts struct {
    commonOpts        // 匿名嵌套:展开为 --verbose/-v 选项
    UserName string `flag:"u" desc:"the user name" required:"true"`
    Age      int    `desc:"the user age" default:"18"`
}

c.MustFromStruct(&demoOpts{}, gcli.TagRuleField)
// => 选项: --user-name/-u (必填), --age (默认 18), --verbose/-v

field 规则的好处是选项名直接取自字段名,descdefault 等属性各自独立成键,可读性更好。

5. 声明式交互收集

如果某个选项必填但用户没传,可以挂载一个 Question。GCli 会在检测到空值时交互式提示输入。

c.StrOpt2(&token, "token", "the access token",
    gflag.WithQuestion("Please input your access token: "))

运行效果:

$ myapp deploy
Please input your access token: ▮

如果同时设置了自定义 Collector,则 Collector 逻辑优先。

6. POSIX 短选项合并

支持了 -a -u -x 合并写成 -aux 的 POSIX 风格。该功能默认关闭,需要通过 Config.EnhanceShort 手动开启。

c.ParserCfg().EnhanceShort = gcli.EnhanceShortMerge  // 1: -aux => -a -u -x
c.ParserCfg().EnhanceShort = gcli.EnhanceShortAttach // 2: 额外支持 -Ostdout => -O stdout

也可以全局开启:

gcli.SetEnhanceShort(gcli.EnhanceShortMerge)
等级 常量 行为
0 EnhanceShortNone 关闭(默认),完全兼容旧行为
1 EnhanceShortMerge 仅当组合全部为 bool 短选项时才拆分
2 EnhanceShortAttach 额外支持取值紧贴写法 -Ostdout = -O stdout

这里做了一个安全限制:只有当组合里的每个字符都是 bool 短选项时才会拆分。像 -aO(其中 O 需要取值)这种混合写法会原样保留,避免误解析。

7. 健壮性修复

除了新功能,也修了几个历史遗留问题:

  • panic 不再被吞掉gflag.Parser.Parse 过去会忽略 recover 的 panic ,现在会作为 error 返回,方便上层处理。
  • help <命令> 首次调用生效:修复了以前可能提示 unknown input command "help" 的问题。
  • findSimilarCmd 逻辑修正:不再在执行未知命令时往注册表写入幽灵 help 条目。
  • Command.Copy() 修复:不再因为共享指针而清空源命令的 hooks 。

破坏性变更与迁移

有少量清理工作,如果依赖了这些内部实现需要做调整:

之前 现在
import ".../gcli/v3/helper" 已转为内部包,请内联自己的 helper
import ".../gcli/v3/gclicom" 已移除( cliui 迁移后已无用)
全局 --verbose 4 选项 环境变量 GCLI_VERBOSE=debug,或 gcli.SetVerbose(gcli.VerbDebug) / gcli.SetDebugMode()

关于移除 --verbose 的原因:它绑定的是一份应用内副本,底层的日志器并没有读取它,实际上不起作用,反而会让应用的选项列表变乱。控制日志级别请改用环境变量或代码。

另外,同一进程内的多个 App 实例现在会共享全局选项( verbose / help / version / strict / completion )。

升级与示例

go get -u github.com/gookit/gcli/v3@latest

仓库的 _examples/cmd 目录下新增了几个可运行的示例,包括 struct-flag(字段标签+匿名字段)、short-merge(短选项合并)和 ask-demo(交互收集)。

如果遇到问题或有建议,欢迎在 GitHub 提 issue 或 PR 。完整 API 文档参考 GoDoc