【发布时间】:2013-08-02 22:47:42
【问题描述】:
我是在 Linux 上部署用 C/C++ 编写的程序的新手,我想知道在这种情况下你会怎么做。
我有一个二进制文件(用 GNU Make 编译)需要读取一个配置文件(例如myprogram.conf)。但是当我编写一个 Makefile 将该文件部署到/usr/bin/ 时,配置文件应该放在哪里?可执行文件如何知道它在哪里?
【问题讨论】:
我是在 Linux 上部署用 C/C++ 编写的程序的新手,我想知道在这种情况下你会怎么做。
我有一个二进制文件(用 GNU Make 编译)需要读取一个配置文件(例如myprogram.conf)。但是当我编写一个 Makefile 将该文件部署到/usr/bin/ 时,配置文件应该放在哪里?可执行文件如何知道它在哪里?
【问题讨论】:
您有无穷无尽的选择,但最好的方法取决于几件事。首先,它是特定于用户的配置文件,还是对所有用户都是全局的?
如果它是特定于用户的,例如,您可以将其保存在 ~/.myprogram/config.file 中并让程序在那里检查。作为为您的用户提供的服务,由您决定如果没有找到该怎么做——也许从其他地方复制一个默认配置,或者生成一个默认配置,或者使用硬编码的默认选项,或者显示一个配置向导,或者只是失败。这完全取决于您。
如果它是全局的,传统的将它放在 Linux 上的地方是 /etc,例如/etc/config.file 或 /etc/myprogram/config.file。见Linux File System Structure。在 Linux 上,您通常总是有一个 /etc。处理文件不存在的情况与上述相同 - 没有“正确”的方法来处理它,它纯粹基于您希望为用户提供的便利程度。
我通常对全局配置文件做的是在安装时将它们放在 /etc/wherever 中,让程序默认从 /etc/wherever 加载配置文件,但也提供一个命令行选项来覆盖配置文件(特别适用于测试或其他情况)。
我通常如何处理丢失的配置文件完全取决于应用程序。我通常要么有硬编码的默认值(如果合适的话),要么干脆失败并将用户引导到一些描述配置文件的文档(我发现在我的安装程序安装配置文件的情况下就足够了)。
希望对您有所帮助。
【讨论】:
这取决于配置参数是什么,以及它们是“每个系统”、“每个用户”、“每个组”还是......
系统配置通常位于/etc/... 的某个位置。在程序所在的同一目录中也是一个非常好的地方。
用户配置,在用户的主目录中。
组配置是最棘手的,因为您可能需要提出一个方案,其中每个“组”都有一个配置文件。 /etc/myprog/groups/<groupname>/config 或类似的东西会起作用。
【讨论】:
在 Linux 上,配置文件的通常位置是“/etc”,因此可以部署像 /etc/myprog.conf 这样的配置文件。但是,这需要root权限。其他不错的选择包括将配置文件放在用户的主目录中,使其类似于 ~/.myprog.conf 或 ~/.myprog/.conf 以使用可以拥有多个配置文件、缓存或其他您想要的东西的文件夹。
至于可执行文件如何知道文件在哪里,一种解决方案是在几个常见位置查找文件。例如,如果您决定将配置放在用户的主目录中,请先在那里查找,如果未找到,请在/etc 下查找。并允许一个特殊的命令行参数来加载不同的配置文件。因此,比如说,调用myprog 可以检查主文件夹中的配置文件,但myprog -c /some/path/config 将使用/some/path/config 作为文件。如果任何地方都没有有效的配置文件,那么有一些默认设置也是一个好主意。
【讨论】:
配置文件可以放在任何地方,但我会尝试将它与程序将读取或写入的任何其他文件放在同一目录中。
至于可执行文件如何找到它,我会在命令行上将配置文件的路径作为参数传递给可执行文件,默认值为“。” (这是当前目录,即您启动可执行文件时所在的目录)。
【讨论】:
.”,这意味着您不必每次都将其作为参数传递。