将配置文件与已编译的 Go 程序一起使用

Using a configuration file with a compiled Go program

我有一个 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.goconfig.json和可执行文件在同一目录中。

程序编译后如何使用config.json文件?

根据您使用的是 go install <your_package> 还是 go build <your_package>,您最终的可执行文件将位于不同的位置。

如果您使用 go build <your_package>,您的可执行文件将位于您调用命令的文件夹中。 IOW,如果您的 运行 go build <your_package> 在包含您的 main.goconfig.json.

的文件夹中,它可能会起作用

如果您使用 go install <your_package>,您的可执行文件将位于您的 $GOPATH/bin 中。在这种情况下,您必须相应地更新 ioutil.ReadFile() 函数调用的参数。

更好的方法是将 config.json 的文件位置作为参数传递给可执行文件,而不是对其进行硬编码。

您的配置文件可能不在您启动应用程序的工作目录中。 但是硬编码文件的路径并不是最好的做法。

方法 #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