[英]cobra-cli pass all arguments and flags to an executable
我有一個 cobra CLI 用於我自己的東西。 現在我想添加常用的可執行文件,例如kubectl
, calicoctl
作為子命令,它們將使用所有參數和標志,如
mywrapper kubectl get all --all-namespaces
mywrapper kubectl create deployment nginx --image=nginx --port=80
復制眼鏡蛇項目
mkdir mywrapper; cd mywrapper; go mod init mywrapper; cobra-cli init .
並添加一個子命令,例如kubectl
cobra-cli add kubectl
然后用./cmd/kubectl.go
填充
package cmd
import (
"fmt"
"os/exec"
"strings"
"github.com/spf13/cobra"
)
var kubectlCmd = &cobra.Command{
Use: "kubectl",
Short: "run kubectl",
Run: func(cmd *cobra.Command, args []string) {
out, err := exec.Command("/bin/bash", "-c", fmt.Sprintf("kubectl %v", strings.Join(args, " "))).Output()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
},
}
func init() {
rootCmd.AddCommand(kubectlCmd)
}
我現在可以運行kubectl
命令,例如go run . kubectl get pods
go run . kubectl get pods
。 但是當添加標志時它會失敗,例如go run . kubectl get pods --selector app=nginx
go run . kubectl get pods --selector app=nginx
在--
之后傳遞你的標志。 雙破折號 (--) 用於表示命令選項的結束。 在我們的例子中,需要區分傳遞給go
的標志和沒有傳遞的標志。 雙破折號之后的所有內容都不會被視為go
的標志。
我嘗試使用 gcloud:
package cmd
import (
"fmt"
"os/exec"
"github.com/spf13/cobra"
)
var gcloudCmd = &cobra.Command{
Use: "gcloud",
Short: "run gcloud",
Run: func(cmd *cobra.Command, args []string) {
out, err := exec.Command("gcloud", args...).Output()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
},
}
func init() {
rootCmd.AddCommand(gcloudCmd)
}
然后嘗試:
$ go run . gcloud compute regions list -- --filter="id<1250"
NAME CPUS DISKS_GB ADDRESSES RESERVED_ADDRESSES STATUS TURNDOWN_DATE
asia-east1 0/24 0/4096 0/8 0/8 UP
europe-west1 0/24 0/4096 0/8 0/8 UP
us-central1 0/24 0/4096 0/8 0/8 UP
us-east1 0/24 0/4096 0/8 0/8 UP
us-west1 0/24 0/4096 0/8 0/8 UP
添加更多標志:
$ go run . gcloud compute regions list -- --filter="id<1250" --format="table(name,id)"
NAME ID
asia-east1 1220
europe-west1 1100
us-central1 1000
us-east1 1230
us-west1 1210
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.