Как предоставить приложение Go cmd в качестве продуктивного приложения

Я создаю следующее репо, в котором используются инструменты командной строки Go cobra для создания некоторых артефактов при выполнении команды go run main.go mzr convert toJSON ./ программа берет файл yaml и генерирует из него файл json.

Теперь я хочу, чтобы мой репозиторий вел себя как следующий инструмент командной строки (пользователь может установить его и запустить справку и использовать команды, поддерживаемые инструментом)

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 (см. результаты в папке сборки), который создает исполняемые файлы для нескольких ОС, но когда я беру файлы и пытаюсь запустить его на n mac и windows, это тоже не работает, что тут делать?


person Community    schedule 16.12.2017    source источник
comment
Что вы ожидали? Вашему приложению Cli не требуются никакие флаги или параметры, поэтому оно просто запустит файл Action.   -  person tkausl    schedule 16.12.2017
comment
если я прав, вас смущает двоичное имя, его доступность в PATH и аргумент командной строки, подкоманда. В вашей текущей работе, представленной здесь, у вас есть двоичный файл с именем приветствие, доступный в пути. github.com/urfave/cli#subcommands   -  person mh-cbon    schedule 16.12.2017
comment
Я думаю, что вы ищете подкоманду   -  person tkausl    schedule 16.12.2017
comment
вы не можете сделать "интерактивный" с этим пакетом. Для интерактивного интерфейса командной строки этот пакет больше подходит github.com/nsf/termbox-go.   -  person mh-cbon    schedule 16.12.2017
comment
вам действительно нужно прочитать документ. дружески говоря RTFM. чтобы помочь вам немного больше, запустите go build, полученный двоичный файл является автономным, готовым к копированию и вставке. Если вам нужно передать его кому-то с другой ОС, чем ваша, GOOS=YYY go build, отдайте ему полученный двоичный файл.   -  person mh-cbon    schedule 16.12.2017
comment
короткий ответ - добавить каталог, содержащий двоичный файл, в PATH пользователя, или поместить двоичный файл в PATH пользователя. Более длинный ответ может заключаться в создании устанавливаемого пакета, который сделает это за него. сначала найдите PATH, прежде чем переходить к упаковке, имхо.   -  person mh-cbon    schedule 16.12.2017
comment
возможный дубликат stackoverflow.com/ вопросы/35827147/   -  person nkprince007    schedule 17.12.2017
comment
@mh-cbon - я обновил свой вопрос полным кодом..   -  person    schedule 24.12.2017
comment
@tkausl - я обновил свой вопрос полным кодом..   -  person    schedule 24.12.2017
comment
@ nkprince007 - я обновил свой вопрос, указав полный код ... дубликат, это не :)   -  person    schedule 24.12.2017
comment
@Ninawatcher Вы пробовали мое решение? Я тестировал его как в Ubuntu, так и в Windows. Работал отлично. Дайте мне знать, если вы получаете ошибки с этим.   -  person Anuruddha    schedule 30.12.2017


Ответы (4)


Я просмотрел базу кода и определил, что следующее должно измениться, чтобы этот инструмент стал независимым от платформы.

Пользователи должны выполнить следующую команду, как вы упомянули

mzr convert toJSON path/to/yaml/

path/to/yaml должен быть независимым от ОС и должен быть абсолютным/относительным путем к файлу. Для этого вы можете внести следующие изменения в функцию преобразования. И удалите зависимость github.com/mitchellh/go-homedir от convert.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
}

Есть 2 способа использования этого инструмента.

  1. Пользователи, настроившие рабочую среду golang

    • Make your package go gettable.

Изменение для файла 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.

Надеюсь, это решило вашу проблему с распространением инструментов. С другой стороны, есть много вещей, которые можно улучшить в кодовой базе, особенно обработка ошибок, иерархия пакетов и т. д. Лучше обратить на них внимание, прежде чем распространять это среди пользователей.

person Anuruddha    schedule 29.12.2017
comment
Спасибо 1+, будет здорово, если вы сможете clone сделать проект и сделать его productive , я предоставил 100 баллов за вознаграждение, потому что я в настоящее время застрял, проект является просто примером для моего более крупного проекта (и репозиторий git довольно маленький) , и это поможет научиться делать это лучше, так как в довольно новом для golang... - person ; 01.01.2018
comment
Конечно, не торопитесь. пожалуйста, обратите внимание также на 'make.sh'. Спасибо! - person ; 01.01.2018
comment
Привет, есть новости :-) ? - person ; 03.01.2018
comment
@Ninawatcher представила изменения вчера. Пожалуйста, проверьте раздел проблем github. - person Anuruddha; 03.01.2018

Проблема может быть в том, что вы строите для всех трех платформ на одной платформе.

Go build может собирать только для текущей платформы. то есть платформа, на которой выполняется сборка.

Однако вы можете использовать goreleaser для независимой автоматизации сборки для платформ.

Ссылка: https://goreleaser.com/#quick_start

person nkprince007    schedule 25.12.2017
comment
нет, вы можете кроссплатформенную компиляцию в linux из windows, в mac из linux и т. д. см. GOOS, GOARCH - person mh-cbon; 25.12.2017
comment
да, но не на все работает, с 1.5 стало лучше, но не идеально - person nkprince007; 26.12.2017
comment
что ты имеешь в виду ? - person mh-cbon; 26.12.2017

На вопрос

Я пытаюсь сделать это с созданием файла 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, просто оно более сложное и выходит за рамки, имхо.

person mh-cbon    schedule 25.12.2017

Надеюсь, это поможет:

Создайте простой сценарий оболочки с именем mzr:

#!/бин/баш -

exec go run main.go mzr $@

Идите своим путем и удачи ;D

person Qinsi    schedule 28.12.2017