【问题标题】:How to provide Go cmd app as productive app如何将 Go cmd 应用程序提供为高效应用程序
【发布时间】:2017-12-29 23:10:17
【问题描述】:

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

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

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 文件(查看构建文件夹中的结果)来为多个操作系统创建可执行文件 但是当我获取文件并尝试在 n mac 和 windows 上运行它时,它也不起作用,我应该在这里做什么?

【问题讨论】:

  • 你期待什么?您的 Cli-App 不需要任何标志或选项,因此只需运行 Action
  • 如果我是正确的,您对二进制名称及其在 PATH 中的可用性和命令行参数 sub command 感到困惑。在此处介绍的当前工作中,路径中有一个名为 greet 的二进制文件。 github.com/urfave/cli#subcommands
  • 我想你要找的是Subcommand
  • 你不能用这个包做“交互”。做交互式 CLI 这个包比较适合github.com/nsf/termbox-go.
  • 您确实需要阅读文档。友好的说 RTFM。为了帮助你更多,运行go build,生成的二进制文件是独立的,可以复制粘贴。如果您需要将其提供给与您的操作系统不同的人,GOOS=YYY go build,请将生成的二进制文件提供给他。

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


【解决方案1】:

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

用户应按照您提到的执行以下命令

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 文件一样构建操作系统特定的发行版

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

【讨论】:

  • 谢谢 1+,如果你能 clone 项目并使它成为 productive 那就太好了,我提供了 100 个赏金点,因为我目前卡住了,项目只是我的更大项目的一个例子(并且 git repo 相当小),这将有助于学习如何做得更好,因为在相当新的 golang 中......
  • 一定要慢慢来。请注意“make.sh”。谢谢!
  • 嗨,有什么消息 :-) ?
  • @Ninawatcher 昨天提交了更改。请查看 github 问题部分。
【解决方案2】:

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

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

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

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

【讨论】:

  • 不,您可以跨平台编译从 windows 到 linux,从 linux 到 mac 等,请参阅 GOOS、GOARCH
  • 是的,但它并不适用于所有情况,自 1.5 以来有所改进,但并不完美
  • 什么意思?
【解决方案3】:

到问题

我尝试通过创建 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_(variable)

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

关于您问题的编程方面

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

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

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

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

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

【讨论】:

    【解决方案4】:

    希望这会有所帮助:

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

    #!/bin/bash -

    exec go run main.go mzr "$@"

    走自己的路,走好运;D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2017-02-07
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      相关资源
      最近更新 更多