首页 > 其他分享 >Cobra CLI 学习笔记

Cobra CLI 学习笔记

时间:2024-09-04 10:13:48浏览次数:9  
标签:初始化 cobra CLI Cobra 笔记 命令 Command var 参数

Cobra CLI 学习笔记

简介

Cobra 是 Go 的 CLI 框架。它包含一个用于创建强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。

官方文档: https://cobra.dev/

安装

go get -u github.com/spf13/cobra/cobra

Cobra 常用参数解析

var rootCmd = &cobra.Command{
	Use:     "",  // 命令
	Aliases: nil, // 别名
	Short:   "",  // 对于该命令简单的介绍
	Long:    "",  // 对于该命令详细的介绍
	Example: "",  // 该命令的使用示例
	Args:    nil, // 位置参数验证
	Version: "",  // 该CLI的版本号
	PreRun:  nil, // 在Run函数执行前执行的操作
	Run:     nil, // 具体执行操作
	PostRun: nil, // 再Run函数执行后执行的操作
}

参数验证

位置参数:Args有以下几种验证方法

  • NoArgs- 不允许有位置参数,如果存在位置参数,该命令将提示错误。
  • ArbitraryArgs- 该命令将接受任何 args。
  • OnlyValidArgs- 如果存在任何不在 字段中的位置参数,该命令将报告错误。ValidArgs``Command
  • MinimumNArgs(int)- 指定位置参数的最小数量,如果没有至少 N 个位置参数,该命令将提示错误。
  • MaximumNArgs(int)-指定位置参数的最大数量, 如果位置参数超过 N个,该命令将提示错误。
  • ExactArgs(int)- 指定解析位置参数的数量,如果没有恰好 N 个位置参数,该命令将提示错误。
  • ExactValidArgs(int)- 如果没有恰好 N 个位置参数,或者有任何位置参数不在 字段中,则该命令将报告并出错ValidArgs``Command
  • RangeArgs(min, max)- 填写一个数值,且该数值介于 最小数量和最大数量之间,否则该命令将提示错误。

例子

package main

import (
	"fmt"
	"github.com/spf13/cobra"
)

var config string
var output string

// 初始化根命令
var rootCmd = &cobra.Command{
	Use:   "tools",
	Short: "这是一个简单的描述",
	Long:  "这是一个详细的描述",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("这是一个Cobra示例", config)
	},
}

// 创建一个命令echo
var echoCmd = &cobra.Command{
	Use:   "echo",
	Short: "输出当前服务信息",
	Args:  cobra.NoArgs,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("当前服务地址:http://127.0.0.0:8000")
	}}

// 创建有一个带位置参数的命令init
var initCmd = &cobra.Command{
	Use:   "init <name>",
	Short: "初始化一个指定服务的配置",
	Args:  cobra.ExactArgs(1), // 解析位置参数name
	Run: func(cmd *cobra.Command, args []string) {
		name := args[0] // 获取位置参数name的值
		fmt.Println("开始执行初始化", name)
	},
}

// 创建命令server
var serverCmd = &cobra.Command{
	Use:   "server",
	Short: "获取服务列表",
}

// 创建命令ls,用于获取服务列表明细
var serverListCmd = &cobra.Command{
	Use:   "ls",
	Short: "获取服务列表",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("当前服务列表:\naa\nbb\ncc")
		fmt.Println("将文件输出到", output)
	},
}

// 创建带有位置参数的命令get,用于获取具体服务的信息
var serverGetCmd = &cobra.Command{
	Use:   "get <name>",
	Short: "获取具体服务信息",
	Args:  cobra.ExactArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		servername := args[0]
		fmt.Println("获取服务信息:", servername)
	},
}

// 运行初始化配置函数
func initConfig() {
	fmt.Println("运行初始化")
}
func main() {
	// 加载初始化配置
	cobra.OnInitialize(initConfig)

	// 将echo,init,server这三个命令加入到根命令下
	rootCmd.AddCommand(echoCmd)
	rootCmd.AddCommand(initCmd)
	rootCmd.AddCommand(serverCmd)

	// 将serverListCmd serverGetCmd 这两个命令作为子命令加入到server命令下
	serverCmd.AddCommand(serverListCmd)
	serverCmd.AddCommand(serverGetCmd)

	// Persistent Flags,持久化的flag,全局可以使用,可以给任一命令添加选项
	rootCmd.PersistentFlags().StringVar(&config, "config", "", "config file (default is $HOME/.firstappname.yaml)")

	// Flags 局部使用,为某一个命令添加选项
	serverListCmd.Flags().StringVar(&output, "output", "", "输出文件")
	serverGetCmd.Flags().StringVar(&output, "output", "", "输出文件")
	// 把 output 设置为必选项
	err := serverListCmd.MarkFlagRequired("output")
	if err != nil {
		return
	}
	// 运行
	if err := rootCmd.Execute(); err != nil {
		return
	}
}

编译打包

go build -o main.exe main.go

测试

D:\code_Go\cli_demo>main.exe -h
这是一个详细的描述

Usage:             
  tools [flags]    
  tools [command]  
                   
Available Commands:
  completion  Generate the autocompletion script for the specified shell
  echo        输出当前服务信息
  help        Help about any command
  init        初始化一个指定服务的配置
  server      获取服务列表

Flags:
      --config string   config file (default is $HOME/.firstappname.yaml)
  -h, --help            help for tools

Use "tools [command] --help" for more information about a command.

D:\code_Go\cli_demo>main.exe echo 
运行初始化
当前服务地址:http://127.0.0.0:8000

D:\code_Go\cli_demo>main.exe init aaaa
运行初始化
开始执行初始化 aaaa

D:\code_Go\cli_demo>main.exe server ls --output=111
运行初始化
当前服务列表:
aa
bb
cc
将文件输出到 111

标签:初始化,cobra,CLI,Cobra,笔记,命令,Command,var,参数
From: https://www.cnblogs.com/jruing/p/18395935

相关文章

  • 学习笔记:数论分块
    数论分块1.0可以快速计算一些含有除法向下取整的和式(形如$\sum_{i=1}^ng(i)\left\lfloor\frac{n}{i}\right\rfloor$)。2.0引理1:\(\left\lfloor\frac{n}{i}\right\rfloor\)的取值最多只有\(2\times\sqrtn\)种。证明:对于\(i\le\left\lfloor\sqrtn\rig......
  • clickhouse组件介绍
    写在前面今天学习clickhouse部分的知识。ClickHouseOLTP(联机事务处理系统)例如MySQL等关系型数据库,适用于小数据量时的快速查询和分析。OLTP主要针对增删改操作,数据经常发生变化。OLAP(联机分析处理系统)适用于数据长期不变且有大量历史数据的场景,主要进行分析操作,增......
  • 【深度学习】嘿马深度学习笔记第7篇:卷积神经网络,学习目标【附代码文档】
    本教程的知识点为:深度学习介绍1.1深度学习与机器学习的区别TensorFlow介绍2.4张量2.4.1张量(Tensor)2.4.1.1张量的类型TensorFlow介绍1.2神经网络基础1.2.1Logistic回归1.2.1.1Logistic回归TensorFlow介绍总结每日作业神经网络与tf.keras1.3神经网络基础......
  • 【Python学习笔记】第1章 问答环节
    人们为什么使用Python软件质量:可读性、可维护性开发者生产效率:代码更少程序的可移植性:同样的代码在不同的操作系统中都可以运行标准库的支持:内置可移植的功能模块组件构成:轻松地与应用程序的其他部分通信享受乐趣:略软件质量追求代码简洁,可读性模块化、面向......
  • 第二天学习笔记:Datawhale X 李宏毅苹果书 AI夏令营
    今天学的有些小兴奋,终于解锁了很多熟悉但不明就里的术语。天呢,原来ReLU是“修正线性单元”的意思!RectifiedLinearUnit!但是呢,也有不大对付的地方:好几个地方前言不搭后语。容我一一道来。今天就顺序边读边记:线性模型(linearmodel)==把模型输入的特征x乘上一个权重,再加......
  • mini-lsm通关笔记Week1Day7
    Summary在上一章中,您已经构建了一个具有get/scan/put支持的存储引擎。在本周末,我们将实现SST存储格式的一些简单但重要的优化。欢迎来到Mini-LSM的第1周零食时间!在本章中,您将:在SST上实现布隆过滤器,并集成到LSM读路径get中。以SST块格式实现对key存储的压缩。要将测试用例......
  • Mybatis学习笔记
    本笔记基于【尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?vd_source=a91dafe0f846ad7bd19625e392cf76d8总结资料获取网址:https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWFMyBatis实践:提高持久层数据......
  • CMake构建学习笔记14-依赖库管理工具
    如果说做C/C++开发最大的痛点是什么,那么一定是缺少一个官方的统一的包管理器。认真的说,如果你要用C/C++干点什么,至少需要(Windows系统下):C/C++语言本身、标准库、以及操作系统API几乎干不了什么,除非你真的想从零开始造轮子。开始找一些现成的实现组成依赖库。最好看能不能找到预......
  • 【读书笔记-《30天自制操作系统》-14】Day15
    本篇内容开始讲解多任务。本篇内容结构很简单,先讲解任务切换的原理,再讲解任务切换的代码实践。但是涉及到的知识不少,理解上也有些难度。1.任务切换与多任务原理1.1多任务与任务切换所谓多任务,指的是操作系统同时运行多个任务。但是这种说法实际上是不准确的。如果只有......
  • 手动脱壳学习笔记1----手动脱upx壳
    ESP定律脱壳例题https://files.buuoj.cn/files/ee7f29503c7140ae31d8aafc1a7ba03f/attachment.tar两下F9按一下F9,ESP变红在ESP处右键在内存窗口处转到在下面的内存下硬件断点再按一下F9在401280处下断点scylla插件输入00401820最后处理......