将配置文件与已编译的 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.go
、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
的文件位置作为参数传递给可执行文件,而不是对其进行硬编码。
您的配置文件可能不在您启动应用程序的工作目录中。
但是硬编码文件的路径并不是最好的做法。
方法 #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 应用程序使用 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
文件?
根据您使用的是 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
的文件位置作为参数传递给可执行文件,而不是对其进行硬编码。
您的配置文件可能不在您启动应用程序的工作目录中。 但是硬编码文件的路径并不是最好的做法。
方法 #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
。