DevopsCamp 第一期作业: 《cobra - 01 实现编译与参数绑定(简略)》 解题答案
原文链接: https://tangx.in/posts/2023/0...
本文为 DevOpsCamp
实战训练的作业解题答案 作业: cobra - 01 实现编译与参数绑定。
DevOpsCamp作业地址: https://www.devopscamp.cc/sem...
作业要求:
- 应用 https://github.com/spf13/cobra 实现命令工具
命令具备以下参数
--name
姓名--age
年龄
- 如果年龄为空, 默认为 20 岁。
- 实现穿插编译脚本, 编译其余平台的二进制文件
-rwxr-xr-x 1 franktang staff 4220672 Jan 13 15:35 greeting-darwin-amd64-rwxr-xr-x 1 franktang staff 4203442 Jan 13 15:35 greeting-darwin-arm64-rwxr-xr-x 1 franktang staff 4215010 Jan 13 15:35 greeting-linux-amd64-rwxr-xr-x 1 franktang staff 4157892 Jan 13 15:35 greeting-linux-arm64
- 执行输入成果如下
$ ./out/greeting-darwin-arm64 你好, 往年 20 岁$ ./out/greeting-darwin-arm64 --age 30 --name zhangsanzhangsan 你好, 往年 30 岁
解题过程
1. 装置依赖包
$ go get -u github.com/spf13/cobra
2. 创立命令
var root = &cobra.Command{ Use: "greeting", // 命令名字 Short: "打招呼", // 短介绍 Run: func(cmd *cobra.Command, args []string) { // 运行函数 greeting(name, age) },}
3. 指定参数
- 定义了变量作为参数接受者。
应用 init 函数, 在程序初始化的时候, 传递参数值。
- 参数接受者 指针类型
- 参数名称, 字符串类型
- 短参数名称, 字符串类型, 但只承受一个参数
- 默认值, 具体类型
- 参数形容, 字符串类型
var ( name = "" age = 0)func init() { root.Flags().StringVarP(&name, "name", "", "", "姓名") root.Flags().IntVarP(&age, "age", "", 20, "年龄")}
4. 调用执行
- greeting 是程序理论执行逻辑, 及执行逻辑入口。
- 在 root 的 Run 中调用 执行逻辑入口。
- 在 main 中调用 root 的执行函数 Execute()
func greeting(name string, age int) { fmt.Printf("%s 你好, 往年 %d 岁\n", name, age)}var root = &cobra.Command{ Use: "greeting", Short: "打招呼", Run: func(cmd *cobra.Command, args []string) { greeting(name, age) // 2. root 命令调用 greeting 业务 },}func main() { err := root.Execute() // 3. main 调用 root 命令 if err != nil { log.Fatal(err) }}
4. 应用 Makefile 进行编译治理
- 应用
GOOS
和GOARCH
设置环境变量命令。 应用
build
命令, 应用进行 以后零碎环境 的编译- 并且编译文件命名蕴含零碎信息。
- 应用
buildx
命令, 实现 穿插编译 - 应用
clean
命令清空编译后果。
## 默认变量, 获取以后 go 的环境变量GOOS ?= $(shell go env GOOS)GOARCH ?= $(shell go env GOARCH)## build 在指定环境变异build: go build -o out/greeting-$(GOOS)-$(GOARCH) .## 通过指定环境变量, 执行穿插编译buildx: GOOS=linux GOARCH=amd64 make build GOOS=linux GOARCH=arm64 make build GOOS=darwin GOARCH=amd64 make build GOOS=darwin GOARCH=arm64 make build## 清理编译后果clean: rm -rf out/
一个最根本命令构造就这样实现了, 是不是很简略?
B站作业视频
https://www.bilibili.com/vide...