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

时间:2017-12-16 17:42:32

标签: bash shell go command-line go-cobra

我正在创建以下使用Go命令行工具cobra的repo 生成一些工件,同时运行命令 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文件夹中的结果),为多个操作系统创建可执行文件 但当我拿走文件并尝试运行它 n mac和windows 时它也无法正常工作,我该怎么办?

4 个答案:

答案 0 :(得分:5)

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

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

mzr convert toJSON path/to/yaml/

path / to / yaml应该是OS独立的,它必须是文件的绝对/相对路径。为此,您可以执行以下更改以转换功能。并从converter.go

中删除github.com/mitchellh/go-homedir依赖项
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
}

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

  1. 设置了golang环境的用户

    • 让您的包裹变得更好。
  2. 更改main.go文件(使用git diff表示法)。

     package main
    
    -import "mzr/cmd/commands"
    +import "github.com/NinaWatcher/mzr/cmd/commands"
    

    执行此操作后,用户可以使用以下命令安装该工具smilar以了解godep的工作方式

    go get github.com/NinaWatcher/mzr

    1. 没有安装golang的用户。

      使用make.sh文件

    2. 构建特定于操作系统的发行版

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

答案 1 :(得分:2)

问题可能是因为您在一个平台上构建了所​​有三个平台。

Go build只能为当前平台构建。即运行构建的平台。

但是,您可以使用goreleaser独立地自动构建平台。

参考:https://goreleaser.com/#quick_start

答案 2 :(得分:1)

问题

  

我尝试创建make.sh文件(参见build中的结果)   文件夹)为多个操作系统创建可执行文件,但是当我服用时   文件,并尝试在Mac和Windows上运行它也不工作,   我该怎么办?

我最好将您重定向到已提供的答案,而不是尝试重复他们的答案。

https://superuser.com/questions/517894/what-is-the-unix-path-variable-and-how-do-i-add-to-it

https://en.wikipedia.org/wiki/PATH_(variable)

tldr:当您在目标计算机上复制可执行文件时,PATH变量中不存在包含该二进制文件的目录,因此,当您调用它时,操作系统无法在文件系统上找到该文件。

到问题的编程方面

我花了一些时间来重写程序,我认为,这是一种更合适的方式。

请检查https://github.com/mh-cbon/demotest/tree/master/help

关于实现目标的警告(使用任何 yaml输入并将其转换为json)是go不太适合这样做。

由于它是一种强类型语言,因此提供预定义的数据结构会更容易。

话虽如此,我不怀疑存在将任何输入转换为json的解决方案,它只是更复杂且超出了范围,imho。

答案 3 :(得分:1)

希望这可以提供帮助:

创建一个名为mzr的简单shell脚本:

  

#!/ bin / bash -

     

exec go run main.go mzr“$ @”

适合自己的道路,祝你好运; D