使用配置文件与编译后的Go程序

5

我有一个使用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
@fl0cke 所有文件都在同一个目录中,我已经将信息添加到帖子中。 - Armand Grillet
1
始终通过完整路径查找配置文件。相对于源文件的路径在部署到另一个系统时没有意义。 - JimB
2个回答

12

你的配置文件可能不在你启动应用程序的工作目录中。但是硬编码文件路径不是最佳实践。

方法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 好建议。我在我的回答中添加了第二段。 - fl0cke
我个人认为,根据使用情况而定,像~/.myappconfig这样使用隐藏文件作为用户主目录的配置文件,并在不存在时提示用户输入信息,也是一种好的做法。可以借助https://github.com/mitchellh/go-homedir实现。 - Philippe CARLE

4
根据您是使用go install <your_package> 还是 go build <your_package> 命令,您的最终可执行文件将会被放置在不同的位置。
如果您使用go build <your_package>命令,您的可执行文件将会被放置在您运行该命令的文件夹中。也就是说,如果您在包含main.goconfig.json的文件夹中运行go build <your_package>,那么它很可能能够正常工作。
如果您使用go install <your_package>命令,您的可执行文件将会被放置在$GOPATH/bin中。在这种情况下,您需要相应地更新ioutil.ReadFile()函数调用的参数。
更好的方法是将config.json的文件位置作为参数传递给您的可执行文件,而不是硬编码在代码中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接