【问题标题】:Using a configuration file with a compiled Go program将配置文件与已编译的 Go 程序一起使用
【发布时间】:2016-02-15 21:17:26
【问题描述】:

我有一个使用 config.json 文件的 Go 应用程序来获取一些信息。执行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文件?

【问题讨论】:

  • 你的 config.json 在哪里?
  • @fl0cke 一切都在同一个目录下,我已经在帖子中添加了信息。
  • 总是设法通过完整路径查找配置文件。当部署到另一个系统时,相对于源文件的路径没有意义。

标签: json go config


【解决方案1】:

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

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

【讨论】:

  • @Volker 好建议。在我的答案中添加了第二段。
  • 恕我直言,我会说使用 homedir 隐藏文件(如 ~/.myappconfig)并在不存在时提示用户输入信息也可能是一个好习惯,具体取决于使用上下文。可通过github.com/mitchellh/go-homedir 实现
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多