我有一只眼镜蛇做自己的东西。现在,我想添加常用的可执行文件,例如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 --selector app=nginx )时,它会失败
发布于 2022-06-22 05:16:46
在--之后传递您的旗帜。双破折号(-)用于表示命令选项的结尾。在我们的例子中,需要区分传递给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 1210https://stackoverflow.com/questions/72708535
复制相似问题