golang通过规范文件定义简单补全功能的插件库carapace-spec的使用
golang通过规范文件定义简单补全功能的插件库carapace-spec的使用
carapace-spec 是一个允许通过规范文件定义简单补全功能的Golang库,它基于carapace实现。
基本使用
下面是一个完整的YAML规范文件示例,展示了如何使用carapace-spec定义命令补全:
name: mycmd
description: my command
flags:
--optarg?: optarg flag # ?表示可选参数
-r, --repeatable*: repeatable flag # *表示可重复参数
-v=: flag with value # =表示需要值的参数
persistentflags:
--help: bool flag
completion:
flag:
optarg: ["one", "two\twith description", "three\twith style\tblue"] # 定义补全选项
v: ["$files"] # 使用$files宏补全文件
commands:
- name: sub
description: subcommand
completion:
positional:
- ["$list(,)", "1", "2", "3"] # 使用$list宏定义列表补全
- ["$directories"] # 使用$directories宏补全目录
功能说明
-
标志定义:
--optarg?
: 可选参数标志-r, --repeatable*
: 可重复标志-v=
: 需要值的标志
-
补全定义:
- 可以为标志定义静态补全选项(如optarg)
- 可以使用预定义宏(如$files, $directories)
- 支持带描述和样式的补全项(如"two\twith description")
-
子命令:
- 可以定义子命令及其补全
- 支持位置参数的补全
完整Golang示例
下面是一个完整的Golang程序示例,展示如何使用carapace-spec:
package main
import (
"fmt"
"os"
"github.com/carapace-sh/carapace-spec/pkg/action"
)
func main() {
// 加载规范文件
spec, err := action.LoadSpec("path/to/spec.yaml")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 执行补全
if len(os.Args) > 1 && os.Args[1] == "complete" {
action.Complete(spec)
return
}
// 正常命令逻辑
fmt.Println("命令执行中...")
}
生成器
carapace-spec还提供了一些生成器,可以从其他库自动生成规范文件:
- carapace-spec-clap: 为clap-rs/clap生成规范
- carapace-spec-kingpin: 为alecthomas/kingpin生成规范
- carapace-spec-kong: 为alecthomas/kong生成规范
- carapace-spec-man: 从manpage生成规范
- carapace-spec-urfavecli: 为urfave/cli生成规范
- carapace-spec-oclif: 为oclif生成规范
注意:虽然可以使用carapace-spec二进制来补全规范文件,但推荐使用carapace-bin,因为它支持更多自定义宏。
更多关于golang通过规范文件定义简单补全功能的插件库carapace-spec的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang通过规范文件定义简单补全功能的插件库carapace-spec的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用carapace-spec创建Golang命令行补全插件
carapace-spec是一个用于为Golang命令行工具创建补全功能的库,它允许你通过YAML规范文件定义补全行为,而无需编写大量代码。下面我将介绍如何使用carapace-spec创建简单的补全功能。
安装
首先安装carapace-spec:
go get github.com/rsteube/carapace-spec
基本用法
1. 创建规范文件
创建一个YAML文件(例如completion.yaml
)来定义你的命令行工具的结构和补全行为:
name: mytool
description: A simple command line tool
commands:
- name: greet
description: Greet someone
flags:
- name: --name
description: Name to greet
completions:
static:
- Alice
- Bob
- Charlie
positional:
- name: language
description: Language to use
completions:
static:
- English
- Spanish
- French
2. 集成到你的程序中
在你的Golang程序中集成补全功能:
package main
import (
"os"
"github.com/rsteube/carapace-spec/pkg/spec"
"github.com/spf13/cobra"
)
func main() {
rootCmd := &cobra.Command{
Use: "mytool",
Short: "A simple command line tool",
}
// 添加greet子命令
greetCmd := &cobra.Command{
Use: "greet",
Short: "Greet someone",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
language := ""
if len(args) > 0 {
language = args[0]
}
// 实际业务逻辑
println("Hello", name, "in", language)
},
}
greetCmd.Flags().String("name", "", "Name to greet")
rootCmd.AddCommand(greetCmd)
// 加载补全规范
spec.FromFile("completion.yaml").AddTo(rootCmd)
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
高级功能
动态补全
除了静态补全,你还可以定义动态补全:
commands:
- name: list
description: List items
positional:
- name: category
description: Item category
completions:
command: mytool categories
条件补全
你可以根据已输入的参数值来定义条件补全:
commands:
- name: deploy
description: Deploy application
flags:
- name: --env
description: Environment
completions:
static:
- dev
- staging
- prod
positional:
- name: service
description: Service to deploy
completions:
command: mytool services --env $env
更复杂的规范示例
name: mytool
description: A complex command line tool
commands:
- name: db
description: Database operations
commands:
- name: migrate
description: Run database migrations
flags:
- name: --database
description: Database name
completions:
command: mytool db list
- name: --version
description: Migration version
completions:
command: mytool db versions --database $database
positional:
- name: direction
description: Migration direction
completions:
static:
- up
- down
构建和测试
- 构建你的程序:
go build -o mytool
- 测试补全功能:
# 测试greet命令的补全
./mytool greet --name <TAB>
# 应该显示Alice, Bob, Charlie
./mytool greet --name Alice <TAB>
# 应该显示English, Spanish, French
总结
carapace-spec提供了一种声明式的方法来为Golang命令行工具添加补全功能,主要优点包括:
- 通过YAML文件定义补全行为,与代码分离
- 支持静态和动态补全
- 可以基于已有输入值进行条件补全
- 与cobra框架无缝集成
这种方法特别适合中大型命令行工具,可以显著减少编写和维护补全代码的工作量。