3 bash shell command-line go go-cobra
我正在创建以下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独立的,它必须是文件的绝对/相对路径.为此,您可以执行以下更改以转换功能.并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)
有两种方法可以使用此工具.
已设置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
没有安装golang的用户.
与make.sh文件一样,构建特定于操作系统的发行版
希望这能解决您的工具分发问题.但是在旁注中,有很多可以在代码库中进行改进的特别是错误处理,包层次结构等.在将它分发给用户之前要注意它们.