如何将Go cmd应用程序作为高效应用程序提供

3 bash shell command-line go go-cobra

我正在创建以下repo,它使用Go命令行工具cobra 生成一些工件,同时运行命令 go run main.go mzr convert toJSON ./程序获取yaml文件并从中生成json文件.

现在我希望我的repo将像下面的命令行工具一样(用户可以安装它并运行帮助并使用工具支持的命令)

https://github.com/golang/dep

用户将能够安装mzr并且能够dep在用户运行时像在存储库中一样运行命令dep init,在我的情况下用户应该运行

mzr convert toJSON path/to/yaml/

这是我的存储库

https://github.com/NinaWatcher/mzr

file.yaml在根内部(和输出json仅用于测试),但用户应提供文件的路径.

逻辑在文件中: cmd/commands/convert.go

我尝试创建make.sh文件(参见build文件夹中的结果),为多个操作系统创建可执行文件,但是当我拿起文件并尝试运行它时,mac和windows也无法正常运行,我该怎么办?在这做?

Anu*_*dha 5

我浏览了代码库并确定以下内容应该按顺序更改,以使此工具与平台无关.

用户应该像你提到的那样执行以下命令

mzr convert toJSON path/to/yaml/

path/to/yaml应该是OS独立的,它必须是文件的绝对/相对路径.为此,您可以执行以下更改以转换功能.并github.com/mitchellh/go-homedir从converter.go中删除依赖项

func convert(args []string) {
 //read file
 // TODO: handle number of arguments and output proper messages.
 yamlFile, err := ioutil.ReadFile(args[0])
 if err != nil {
    log.Printf("yamlFile.Get err   #%v ", err)
 }
 //Format the yaml to json
 fmt.Println("Start converting: " + strings.Join(args, " "))
 jsonOut, err := YAML.YAMLToJSON(yamlFile) // TODO: handle error
 fmt.Println(string(jsonOut))
 err = ioutil.WriteFile("jsonFile.json", jsonOut, 0644) // TODO: handle error
}
Run Code Online (Sandbox Code Playgroud)

有两种方法可以使用此工具.

  1. 已设置golang环境的用户

    • 让您的包裹变得更好.

更改main.go文件(使用git diff表示法).

 package main

-import "mzr/cmd/commands"
+import "github.com/NinaWatcher/mzr/cmd/commands"
Run Code Online (Sandbox Code Playgroud)

执行此操作后,用户可以使用以下命令安装该工具以了解其godep工作原理

go get github.com/NinaWatcher/mzr

  1. 没有安装golang的用户.

    与make.sh文件一样,构建特定于操作系统的发行版

希望这能解决您的工具分发问题.但是在旁注中,有很多可以在代码库中进行改进的特别是错误处理,包层次结构等.在将它分发给用户之前要注意它们.