DevopsCamp 第一期作业: 《cobra - 01 实现编译与参数绑定(简略)》 解题答案

原文链接: https://tangx.in/posts/2023/0...

本文为 DevOpsCamp 实战训练的作业解题答案 作业: cobra - 01 实现编译与参数绑定

DevOpsCamp作业地址: https://www.devopscamp.cc/sem...

作业要求:

  1. 应用 https://github.com/spf13/cobra 实现命令工具
  2. 命令具备以下参数

    1. --name 姓名
    2. --age 年龄
  3. 如果年龄为空, 默认为 20 岁。
  4. 实现穿插编译脚本, 编译其余平台的二进制文件
-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
  1. 执行输入成果如下
$ ./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. 指定参数

  1. 定义了变量作为参数接受者。
  2. 应用 init 函数, 在程序初始化的时候, 传递参数值。

    1. 参数接受者 指针类型
    2. 参数名称, 字符串类型
    3. 短参数名称, 字符串类型, 但只承受一个参数
    4. 默认值, 具体类型
    5. 参数形容, 字符串类型
var (    name = ""    age  = 0)func init() {    root.Flags().StringVarP(&name, "name", "", "", "姓名")    root.Flags().IntVarP(&age, "age", "", 20, "年龄")}

4. 调用执行

  1. greeting 是程序理论执行逻辑, 及执行逻辑入口。
  2. 在 root 的 Run 中调用 执行逻辑入口。
  3. 在 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 进行编译治理

  1. 应用 GOOSGOARCH 设置环境变量命令。
  2. 应用 build 命令, 应用进行 以后零碎环境 的编译

    • 并且编译文件命名蕴含零碎信息。
  3. 应用 buildx 命令, 实现 穿插编译
  4. 应用 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...