---
# System prepended metadata

title: Cobra
tags: [Golang]

---

---
title: Cobra
---
# Cobra
###### tags: `Golang`

[Toc]

### 簡介
讓你的程式提供CLI指令工具的套件

### 簡易觀念
首先需要明确 3 个基本概念：

命令（Command）：就是需要执行的操作；
参数（Arg）：命令的参数，即要操作的对象；
选项（Flag）：命令选项可以调整命令的行为。

下面示例中，server是一个（子）命令，--port是选项：

> hugo server --port=1313

下面示例中，clone是一个（子）命令，URL是参数，--bare是选项：

> git clone URL --bare

### 安裝
> go install github.com/spf13/cobra

ps.1: 如果報錯要你先go get 就照做，然後再go install就可以了
ps.2: 不要看網路上一堆三小要你go get 然後本地command not fund的雞巴教學

測試: cobra version


### Init
到專案目錄執行: 
> cobra init

會自動在專案目錄第一層建立main.go, 並Execute 目錄cmd下的root.go


### 開始建立自己的command

在root同層建立其他的go服務，並在裡面向cobra註冊你要新增的subcommand
註冊方式看代碼: https://github.com/ronnielin8862/go-practice/blob/master/cmd/cobraTest.go 

無法一次執行兩個subcommand

### 常用指令說明
```
var rootCmd = &cobra.Command{
	Use: "serve",
	Long: `A`,
	Short: "B",
	Run: func(cmd *cobra.Command, args []string) { fmt.Println("fuck") }
	
rootCmd.AddCommand(serveCmd) // 向rootCmd 註冊

matchLiveCmd.Flags().StringVarP(&cfgFile, "config", "c", "chatroom_config.toml", "config filename")
matchLiveCmd.Flags().BoolVarP(&printCfg, "print-config", "", false, "print config contents")
```

1. Use: 起專案時帶入的subcommand, 符合的時候便會進入以下的這坨屎
2. Short: 當你對專案執行help, or -h, 時會出現的提示，告訴user這subcommand可以幹三小蠢事。 ex: go run main.go -h (你會得到Ｂ)
3. Long: 當針對你的subcommand -h 時會出現的。 算是提示用戶的詳細訊息。 ex: go run main.go serve -h (你會得到Ａ)
4. Run: 這才是重點，執行你要他幹的蠢事。 ex: go run main.go serve (你會得到 fuck)

