DevopsCamp 第一期: 《cobra - 01 实现编译与参数绑定(简单)》

简介: 初始化 cobra 项目, 绑定参数, 实现交叉编译

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

原文链接: https://typonotes.com/posts/2023/01/23/devopscamp-cobra01/

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

DevOpsCamp作业地址: https://www.devopscamp.cc/semi-plan-202301-2/posts/homework/cobra01/

devopscamp-logo

作业要求:

  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/video/BV1p24y1a7uc/

相关文章
|
JSON Kubernetes 算法
Cobra 命令自动补全指北
本篇文章就来讲讲如何使用 Cobra 来实现命令自动补全。
3629 0
|
6月前
|
Shell Python
技术经验解读:使用python脚本传递参数:(三种方式可收藏)
技术经验解读:使用python脚本传递参数:(三种方式可收藏)
49 0
|
机器学习/深度学习 Web App开发 数据可视化
过节福利 | MMCV Hook 超全使用方法(下)
在训练过程中,通常有十个关键位点,如下图所示,从训练开始到结束,所有关键位点已用红色标出,共有 10 个。我们可以在这十个位点插入各种逻辑,例如加载模型权重、保存模型权重。而我们将同一类型的逻辑组织成一个 Hook。因此,MMCV 中 Hook 的作用就是训练和验证模型时,在不改变其他代码的前提下,灵活地在不同位点插入定制化的逻辑。
1935 0
过节福利 | MMCV Hook 超全使用方法(下)
|
Cloud Native 数据建模 Go
golang 占位符还傻傻分不清?
golang 占位符还傻傻分不清?
|
Kubernetes 容器
开发 k8s 管理平台 - k8sailor 02. 使用 cobra 初始化程序命令与参数
开发 k8s 管理平台 - k8sailor 02. 使用 cobra 初始化程序命令与参数
155 0
开发 k8s 管理平台 - k8sailor 02. 使用 cobra 初始化程序命令与参数
|
SQL 自然语言处理 分布式计算
HiveSQL源码之语法词法编译文件解析一文详解
HiveSQL源码之语法词法编译文件解析一文详解
362 0
HiveSQL源码之语法词法编译文件解析一文详解
|
消息中间件 PHP
laravel中给命令行携带参数不了解一下吗?
laravel中给命令行携带参数不了解一下吗?
410 0
laravel中给命令行携带参数不了解一下吗?
过节福利 | MMCV Hook 超全使用方法(上)
在训练过程中,通常有十个关键位点,如下图所示,从训练开始到结束,所有关键位点已用红色标出,共有 10 个。我们可以在这十个位点插入各种逻辑,例如加载模型权重、保存模型权重。而我们将同一类型的逻辑组织成一个 Hook。因此,MMCV 中 Hook 的作用就是训练和验证模型时,在不改变其他代码的前提下,灵活地在不同位点插入定制化的逻辑。
647 0
过节福利 | MMCV Hook 超全使用方法(上)
|
缓存
TP框架中S函数使用方法
TP框架中S函数使用方法
2663 0