如何将 Go cmd 应用程序作为生产应用程序提供



我正在创建以下使用 Go 命令行工具眼镜蛇的存储库 生成一些伪影,同时运行命令go run main.go mzr convert toJSON ./程序获取yaml文件并 从它生成 JSON 文件。

现在我希望我的存储库的行为类似于以下命令行工具(用户可以安装它并运行帮助并使用该工具支持的命令)

https://github.com/golang/dep

用户将能够安装mzr并能够运行 命令在里面,就像用户运行dep init时在dep存储库中一样, 就我而言,用户应该运行

mzr convert toJSON path/to/yaml/

这是我的存储库

https://github.com/NinaWatcher/mzr

我在根目录中有file.yaml(以及仅用于测试的输出 json),但用户应提供文件的路径。

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

我尝试通过创建 make.sh 文件(请参阅构建文件夹中的结果)来做到这一点,该文件为多个操作系统创建可执行文件 但是当我获取文件并尝试在Mac 和 Windows上运行它时,它也无法正常工作,我应该在这里做什么?

我浏览了代码库并确定以下内容应该更改,以使此工具独立于平台。

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

mzr convert toJSON path/to/yaml/

path/to/yaml 应该是独立于操作系统的,并且必须是文件的绝对/相对路径。为此,您可以进行以下更改以转换功能。并从 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 环境的用户

    • 让您的软件包变得可获取。

更改 main.go 文件(在 git diff 表示法中)。

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

完成此操作后,用户可以使用以下命令安装该工具,微笑着了解godep的工作原理

go get github.com/NinaWatcher/mzr

  1. 安装 golang 的用户。

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

希望这解决了您的工具分配问题。不过,附带说明一下,代码库中有很多可以改进的地方,特别是错误处理、包层次结构等。在将其分发给用户之前,最好注意它们。

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

Go build 只能针对当前平台构建,即运行构建的平台。

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

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

对于问题

我尝试通过创建 make.sh 文件来做到这一点(请参阅构建中的结果 文件夹),为多个操作系统创建可执行文件,但当我采取 文件并尝试在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_(可变)

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

到您问题的编程方面

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

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

围绕您的实现目标(获取任何yaml 输入并将其转换为 json)的警告是,go 不太适合轻松做到这一点。

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

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

希望这能有所帮助:

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

#!/bin/bash -

exec go run main.go mzr "$@">

适合自己的道路,并有好运;D

相关内容

  • 没有找到相关文章

最新更新