Использование файла конфигурации с скомпилированной программой 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 в качестве аргумента для вашего исполняемого файла, вместо того, чтобы жестко его кодировать.

Другие вопросы по тегам