dmnBrest
@dmnBrest
Salesforce for money. Python, Go, Ruby for soul.

Как в Go получить абсолютный путь запущенной программы?

Привет. Столкнулся с такой интересной проблемой и не могу в инете найти ответ на такой простейший вопрос. Вернее я его нашел, но он у меня не работает.

Смысл получить абсолютный путь к запущенному серверу, чтобы подгрузить файл config.json, который лежит рядом.
Вот собственно сам код:
rootDir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
glog.Infoln("rootDir:", rootDir)

но для go run server.go он мне выдает не текущую папку исходников, а временную папку, куда компилируется:
/tmp/go-build880064735/command-line-arguments/_obj/exe
Причем я заметил что, если запускать сервер под gin, то все нормально и путь возвращается правильный.
Я понимаю что это нормальное поведение (временная компиляция по go run где-то там в бакграунде), но как вообще поступают в таких случаях чтобы не хардкодить?
  • Вопрос задан
  • 4553 просмотра
Решения вопроса 2
@neolink
у меня сборка идет через make (всегда делается go build, потом запуск собранного бинарника), а путь к конфигу передается через параметры (flags)
как варинт можете смотреть в нескольких местах, и к rootDir добавить еще os.Getwd()
Ответ написан
Tyranron
@Tyranron
Все правильно, go run - это же не Ваш бинарник, это утилита, которая сначал компилит Ваш код в бинарник и помещает во временную директорию под уникальным номером, потом запускает. Gin, вероятно, действует иначе, компилит в ту же директорию где лежит скрипт и запускает.
Чтобы не хардкодить - прекратите запускать сервера с помощью go run. Команда
go build -o myapp && ./myapp
не сильно сложнее, но зато будете уверены, что бинарник запускается там, где нужен.
Обычно go run принято использовать для небольших скриптов, которые выполняют разовую работу, то есть таких, которые компилить нет особо смысла, хочется сразу прогнать.

P.S. Пользуясь случаем, скромно попиарюсь и выложу ссылку на свою поделку для простой демонизации простых приложений на Go, когда юзать какой-то продвинутый гипервизор процессов влом или неоправданно. Но он пока только для linux/osx.
Загляните в код, он небольшой и там это все есть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ataraev
@ataraev
Ruby, Go
bitbucket.org/kardianos/osext

folder, _ := osext.ExecutableFolder()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы