【golang】15、cobra cli 命令行库

Cobra 是 golang 最流行的命令行库,文档见
一、脚手架
mkdir pt && cd pt && go mod init
cobra-cli init # 在项目下运行即可生成脚手架# tree
.
├── LICENSE
├── cmd # 生成了cmd目录
│ └── root.go # 生成了root.go, 其中定义了rootCmt变量
├── go.mod
├── go.sum
└── main.go# go run main.go
Usage:pt [command]Available Commands:completion Generate the autocompletion script for the specified shellhelp Help about any commandshow Display current timeFlags:-h, --help help for pt-t, --toggle Help message for toggle
二、子命令
# cobra-cli add show # 添加名为show的子命令, 则会自动生成cmd/show.go代码# go run main.go show # 执行名为show的子命令
2023-08-28 22:00:58.263991 +0800 CST m=+0.000923251# go run main.go show -h # 获取名为show的子命令的帮助信息
will display like 2023-08-28 22:00:58.263991 +0800 CST m=+0.000923251Usage:pt show [flags]Flags:-h, --help help for show
三、flag 参数
3.1 定义
// 添加参数
func init() {rootCmd.AddCommand(proto2jsonCmd)proto2jsonCmd.Flags().StringP("content", "c", "", "byte content of a.proto")proto2jsonCmd.Flags().StringP("filepath", "f", "", "filepath of proto file")
}// 输出如下:
with a.proto protocolUsage:pt p2j [flags]Flags:-c, --content string byte content of a.proto-f, --filepath string filepath of proto file-h, --help help for p2j
3.2 使用
如果需要使用 全局flag 或者 局部flag,需要在合适的作用域内定义变量存储 flag 值,以便 flag 可在特定作用域内生效。
3.2.1 使用全局flag
让一个 flag 对所有命令生效,需要在 root.go 文件中创建一个变量存储 flag 值。
如需要定义一个全局flag name:
// 在root.go 文件中添加一个变量name
var name string// 在init函数中添加全局flag,将flag值存储到变量name中
rootCmd.PersistentFlags().StringVar(&name, "name", "", "set name")// 在子命令version的Run方法中输出name
Run: func(cmd *cobra.Command, args []string) { fmt.Println("name is: ", name)
}// 执行命令
./demo version --name a
输出:
name is: a
3.2 使用局部 flag
让一个 flag 对某个命令生效,需要在该命令文件中创建一个变量存储 flag 值。
如需要给version命令定义一个局部flag name:
// 定义变量content
var content string// 在version.go的init函数中添加flag
versionCmd.Flags().StringVarP(&content, "content", "s", "false", "you are my sunshine")// 在子命令version.go的Run方法中输出
Run: func(cmd *cobra.Command, args []string) { fmt.Println("name is: ", name)fmt.Println("content is: ", content)
}// 执行命令
./demo version --name a --content b
输出:
name is: a
content is: b
3.3 cmd 只能访问到自己定义的 flag 值
注意:将 flags 存储到本地变量当中,那么其他命令「不可以」用某个命令的 局部flag。因为局部flag虽然是定义在某个命令文件中作为局部变量,cmd 文件夹下的其他文件可以访问这个变量,但是其他命令如果没有定义自己的 局部flag 获取相同 flag 值的话,获取到的值是该局部变量的零值。示例如下:
// 1. 添加一个新命令helloworld
> cobra add helloworld// 2.输出content值
Run: func(cmd *cobra.Command, args []string) { fmt.Println("content is: ", sunshine)
}// 3.执行命令
> ./demo helloworld --content b
Error: unknown flag: --content // 输出错误未知flag, 原因就是该命令并未定义名为content的局部flag
3.4 必填 flag
// init文件中增加flag定义
versionCmd.Flags().StringVarP(&sunshine, "content", "c", "", "my content")
versionCmd.MarkFlagRequired("content")// 执行
> ./demo version// 输出
Error: required flag(s) "content" not set // 说明必须要设置flag content// 传入content flag
> ./demo version --content b // 输出: content is: b
3.5 全局 flag 配置
MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错
MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错
ExactArgs(int) 如果参数数目不是配置的参数个数时报错
NoArgs 没有参数则报错
示例如下:
// 添加一个命令path
> cobra add path// 设置该命令需要且仅需要一个参数,并在Run方法中取出参数
var pathCmd = &cobra.Command{ Use: "path [path]",Short: "A brief description of your command",Long: "", Args: cobra.ExactArgs(1),Run: func(cmd *cobra.Command, args []string) {fmt.Println("path called")fmt.Println("path:", args[0])},
}// 执行命令并输出
> ./demo path /home // 输出path: /home
相关文章:
【golang】15、cobra cli 命令行库
Cobra 是 golang 最流行的命令行库,文档见 一、脚手架 mkdir pt && cd pt && go mod init cobra-cli init # 在项目下运行即可生成脚手架# tree . ├── LICENSE ├── cmd # 生成了cmd目录 │ └── root.go # 生成了root.go, 其中定义了ro…...
黑马 大事件项目 笔记
学习视频:黑马 Vue23 课程 后台数据管理系统 - 项目架构设计 在线演示:https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径: http:/…...
C#2010 .NET4 解析 json 字符串
下载Newtonsoft.Json.dll using System; using System.Collections.Generic; using System.Linq; using System.Text;using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; namespace ConsoleApplication1 {class Program{static void Main(string[] args){strin…...
flutter Could not get unknown property ‘ndkVersion’
使用的 flutter 版本为 3.7.2 ,编译运行 如下 Could not get unknown property ‘ndkVersion’ for object of type com.android.build.gradle.internal.dsl.BaseAppModuleExtension 解决方法是 在flutter-3.7.2\packages\flutter_tools\gradle\flutter.gradle配置…...
WebSocket--技术文档--架构体系--《WebSocket实现原理以及关键组件》
WebSocket产生背景 简单的说,WebSocket协议之前,双工通信是通过多个http链接来实现,这导致了效率低下。WebSocket解决了这个问题。下面是标准RFC6455中的产生背景概述。 长久以来, 创建实现客户端和用户端之间双工通讯的web app都会造成HTT…...
LeetCode-45-跳跃游戏Ⅱ-贪心算法
题目描述: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…...
商品详情接口使用 API 调用获取商品数据的完整方案
在电子商务应用程序中,商品详情接口是不可或缺的一部分。它用于从电商平台或自己的数据库中获取商品数据,并将其提供给应用程序的其他部分使用。本文将详细介绍如何设计一个完整的商品详情接口方案,其中包括使用 API 调用来获取商品数据的过程…...
vue+element-ui el-table组件二次封装实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题
一、此功能已集成到TTable组件中 二、最终效果 三、需求 某些页面不做分页时,当数据过多,会导致页面卡顿,甚至卡死 四、虚拟滚动 一、固定一个可视区域的大小并且其大小是不变的,那么要做到性能最大化就需要尽量少地渲染 DOM 元素…...
5.1 树和二叉树的定义
思维导图: 问题 为什么有树和二叉树? "树" 和 "二叉树" 都是数据结构中常用的结构,它们分别有其独特的应用和优点。我们可以从它们的定义和特性中理解为什么它们都存在。 1. **树 (Tree):** - **定义**:…...
Java单元测试及常用语句 | 京东物流技术团队
1 前言 编写Java单元测试用例,即把一段复杂的代码拆解成一系列简单的单元测试用例,并且无需启动服务,在短时间内测试代码中的处理逻辑。写好Java单元测试用例,其实就是把“复杂问题简单化,建单问题深入化“。在编写的…...
详解Vue中的render: h => h(App)
声明:只是记录,会有错误,谨慎阅读 我们用脚手架初始化工程的时候,main.js的代码如下 import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({// 把app组件放入容器中render: h > h(App), }).$mount(#ap…...
归并排序的详解!
本文旨在讲解归并排序的实现(递归及非递归)搬好小板凳,干货来了! 前序: 在介绍归并排序之前,需要给大家介绍的是什么是归并,归并操作,也叫归并算法,指的是将两个顺序序列…...
排盘程序算法探寻举例(陆先生八字)
算法实现: 1.庚生未月,燥土不能生金,日支申金为日主墙根,月干辛金比劫透出傍身,月干强。年干甲木自做寅木强根,又得月支乙木中气,甲木强旺有力,时干丙火七杀得未土余气,…...
考研408 | 【操作系统】终章
I/O设备的基本概念和分类 I/O设备: I/O设备的分类 1.按使用特性: 2.按传输速率分类: 3.按信息交换的单位分类: 总结: I/O控制器 I/O设备的机械部件: I/O设备的电子部件(I/O控制器&#…...
亚马逊云科技生成式AI技术辅助教学领域,近实时智能应答2D数字人搭建
早在大语言模型如GPT-3.5等的兴起和被日渐广泛的采用之前,教育行业已经在AI辅助教学领域有过各种各样的尝试。在教育行业,人工智能技术的采用帮助教育行业更好地实现教学目标,提高教学质量、学习效率、学习体验、学习成果。例如,人…...
Programming abstractions in C阅读笔记:p139-p143
《Programming Abstractions In C》学习第55天,p139-p140,总结如下: 一、技术总结 1.文件I/O操作 文件I/O操作可以分为一下这些步骤: (1)声明文件指针对象。 File *infile;(2)打开文件 fopen()。打开文件的模式有“r”, “w…...
MyBatis-Plus学习笔记
1.MyBatis-Plus简介: MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速的实现对单…...
linux安装docker全过程
3. 第二步:设置docker的存储库。就两条命令,我们直接执行就好。 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 4. 安装docker engine和docker-compose。 执行命…...
Spring 中存取 Bean 的相关注解
目录 一、五大类注解 1、五大类注解存储Bean对象 1.1Controller(控制器储存) 1.2Service(服务存储) 1.3Repository(仓库存储) 1.4Component(组件存储) 1.5Configuration(配置存储) 2、五大类注解小结 2.1为什么要这么多类注解 2.2 五大类注解之间的关系 二、方法注解 1.方法注…...
Camunda 7.x 系列【38】表单服务 FormService
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 演示2.1 获取流程开始表单2.2 启动流程2.3 查询任务表单2.4 完成任务3. 实际开发…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
