乐趣区

关于devops:DevopsCamp-第一期作业-cobra-01-实现编译与参数绑定简单-解题答案

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 zhangsan
zhangsan 你好, 往年 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…

退出移动版