Использование файла конфигурации с скомпилированной программой Go
У меня есть приложение Go, использующее config.json
файл, чтобы получить некоторую информацию. При выполнении go run main.go
это работает, но когда я компилирую приложение в исполняемый файл, у меня появляется ошибка open config.json: no such file or directory
,
Мой код:
func main() {
data, err := ioutil.ReadFile("./config.json")
check(err)
var config config
err = json.Unmarshal(data, &config)
check(err)
}
Я тоже пробовал ioutil.ReadFile("config.json")
и это не работает. check(err)
и config
структура в main.go
проблема не исходит отсюда.
main.go
, config.json
и исполняемый файл находятся в одном каталоге.
Что я должен сделать, чтобы иметь возможность использовать config.json
файл после компиляции программы?
2 ответа
Ваш конфигурационный файл, вероятно, не находится в рабочем каталоге, в котором вы запустили ваше приложение. Но жесткое программирование пути к файлу не является лучшей практикой.
Подход № 1: Аргумент командной строки
Использовать flag
пакет для передачи пути к вашему конфигурационному файлу в виде флага командной строки:
var filename = flag.String("config", "config.json", "Location of the config file.")
func main() {
flag.Parse()
data, err := ioutil.ReadFile(*filename)
check(err)
var config config
err = json.Unmarshal(data, &config)
check(err)
}
Запустите приложение с ./application -config=/path/to/config.json
(зависит от вашей платформы).
Подход № 2. Переменная среды
Использовать os
пакет для чтения пути из вашей системной среды.
func main() {
filename := os.Getenv("PATH_TO_CONFIG")
if filename == "" {
filename = "config.json"
}
data, err := ioutil.ReadFile(filename)
check(err)
var config config
err = json.Unmarshal(data, &config)
check(err)
}
Установите переменную среды export PATH_TO_CONFIG=/path/to/config.json
(зависит от вашей платформы) и запустите приложение.
Оба подхода будут пытаться найти config.json
в рабочем каталоге, если путь к приложению не указан.
В зависимости от того, используете ли вы go install <your_package>
или же go build <your_package>
Ваш окончательный исполняемый файл окажется в другом месте.
Если вы используете go build <your_package>
Ваш исполняемый файл будет находиться в папке, в которой вы вызвали команду. IOW, скорее всего, это сработает, если вы запустите go build <your_package>
в папке, содержащей ваши main.go
а также config.json
,
Если вы используете go install <your_package>
, ваш исполняемый файл будет находиться в вашем $GOPATH/bin
, В этом случае вам придется обновить аргумент до ioutil.ReadFile()
вызов функции соответственно.
Лучший подход - передать местоположение файла вашего config.json
в качестве аргумента для вашего исполняемого файла, вместо того, чтобы жестко его кодировать.