当前位置: 首页 > news >正文

【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-跳跃游戏Ⅱ-贪心算法

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…...

商品详情接口使用 API 调用获取商品数据的完整方案

在电子商务应用程序中&#xff0c;商品详情接口是不可或缺的一部分。它用于从电商平台或自己的数据库中获取商品数据&#xff0c;并将其提供给应用程序的其他部分使用。本文将详细介绍如何设计一个完整的商品详情接口方案&#xff0c;其中包括使用 API 调用来获取商品数据的过程…...

vue+element-ui el-table组件二次封装实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题

一、此功能已集成到TTable组件中 二、最终效果 三、需求 某些页面不做分页时&#xff0c;当数据过多&#xff0c;会导致页面卡顿&#xff0c;甚至卡死 四、虚拟滚动 一、固定一个可视区域的大小并且其大小是不变的&#xff0c;那么要做到性能最大化就需要尽量少地渲染 DOM 元素…...

5.1 树和二叉树的定义

思维导图&#xff1a; 问题 为什么有树和二叉树&#xff1f; "树" 和 "二叉树" 都是数据结构中常用的结构&#xff0c;它们分别有其独特的应用和优点。我们可以从它们的定义和特性中理解为什么它们都存在。 1. **树 (Tree)&#xff1a;** - **定义**:…...

Java单元测试及常用语句 | 京东物流技术团队

1 前言 编写Java单元测试用例&#xff0c;即把一段复杂的代码拆解成一系列简单的单元测试用例&#xff0c;并且无需启动服务&#xff0c;在短时间内测试代码中的处理逻辑。写好Java单元测试用例&#xff0c;其实就是把“复杂问题简单化&#xff0c;建单问题深入化“。在编写的…...

详解Vue中的render: h => h(App)

声明:只是记录&#xff0c;会有错误&#xff0c;谨慎阅读 我们用脚手架初始化工程的时候&#xff0c;main.js的代码如下 import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({// 把app组件放入容器中render: h > h(App), }).$mount(#ap…...

归并排序的详解!

本文旨在讲解归并排序的实现&#xff08;递归及非递归&#xff09;搬好小板凳&#xff0c;干货来了&#xff01; 前序&#xff1a; 在介绍归并排序之前&#xff0c;需要给大家介绍的是什么是归并&#xff0c;归并操作&#xff0c;也叫归并算法&#xff0c;指的是将两个顺序序列…...

排盘程序算法探寻举例(陆先生八字)

算法实现&#xff1a; 1.庚生未月&#xff0c;燥土不能生金&#xff0c;日支申金为日主墙根&#xff0c;月干辛金比劫透出傍身&#xff0c;月干强。年干甲木自做寅木强根&#xff0c;又得月支乙木中气&#xff0c;甲木强旺有力&#xff0c;时干丙火七杀得未土余气&#xff0c;…...

考研408 | 【操作系统】终章

I/O设备的基本概念和分类 I/O设备&#xff1a; I/O设备的分类 1.按使用特性&#xff1a; 2.按传输速率分类&#xff1a; 3.按信息交换的单位分类&#xff1a; 总结&#xff1a; I/O控制器 I/O设备的机械部件&#xff1a; I/O设备的电子部件&#xff08;I/O控制器&#…...

亚马逊云科技生成式AI技术辅助教学领域,近实时智能应答2D数字人搭建

早在大语言模型如GPT-3.5等的兴起和被日渐广泛的采用之前&#xff0c;教育行业已经在AI辅助教学领域有过各种各样的尝试。在教育行业&#xff0c;人工智能技术的采用帮助教育行业更好地实现教学目标&#xff0c;提高教学质量、学习效率、学习体验、学习成果。例如&#xff0c;人…...

Programming abstractions in C阅读笔记:p139-p143

《Programming Abstractions In C》学习第55天&#xff0c;p139-p140&#xff0c;总结如下&#xff1a; 一、技术总结 1.文件I/O操作 文件I/O操作可以分为一下这些步骤&#xff1a; (1)声明文件指针对象。 File *infile;(2)打开文件 fopen()。打开文件的模式有“r”, “w…...

MyBatis-Plus学习笔记

1.MyBatis-Plus简介&#xff1a; MyBatis-Plus是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速的实现对单…...

linux安装docker全过程

3. 第二步&#xff1a;设置docker的存储库。就两条命令&#xff0c;我们直接执行就好。 ​ 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. 实际开发…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...