我正在创建以下repo,它使用Go命令行工具cobra生成一些工件,同时运行命令go run main.go mzr convert toJSON ./
程序获取yaml文件并从中生成json文件。
现在我希望我的repo将像下面的命令行工具一样(用户可以安装它并运行帮助并使用工具支持的命令)
当用户运行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上运行它也不能正常工作时,我该怎么办这里 ?
我浏览了代码库并确定以下内容应该按顺序更改,以使此工具与平台无关。
用户应该像你提到的那样执行以下命令
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
}
有两种方法可以使用此工具。
更改main.go文件(使用git diff表示法)。
package main
-import "mzr/cmd/commands"
+import "github.com/NinaWatcher/mzr/cmd/commands"
执行此操作后,用户可以使用以下命令安装该工具,类似于godep
的工作原理
go get github.com/NinaWatcher/mzr
希望这能解决您的工具分发问题。但是在旁注中,有很多可以在代码库中进行改进的特别是错误处理,包层次结构等。在将它分发给用户之前要注意它们。
问题可能是因为您在一个平台上构建了所有三个平台。
Go build只能为当前平台构建。即构建正在运行的平台。
但是,您可以使用goreleaser独立地自动构建平台。
我尝试创建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。
希望这可以帮助:
创建一个名为mzr的简单shell脚本:
#!/ bin / bash -
exec go run main.go mzr“$ @”
适合自己的道路,祝你好运; D.