【问题标题】:Deploying an executable with a configuration file使用配置文件部署可执行文件
【发布时间】:2013-08-02 22:47:42
【问题描述】:

我是在 Linux 上部署用 C/C++ 编写的程序的新手,我想知道在这种情况下你会怎么做。

我有一个二进制文件(用 GNU Make 编译)需要读取一个配置文件(例如myprogram.conf)。但是当我编写一个 Makefile 将该文件部署到/usr/bin/ 时,配置文件应该放在哪里?可执行文件如何知道它在哪里?

【问题讨论】:

    标签: c++ c linux gnu-make


    【解决方案1】:

    您有无穷无尽的选择,但最好的方法取决于几件事。首先,它是特定于用户的配置文件,还是对所有用户都是全局的?

    如果它是特定于用户的,例如,您可以将其保存在 ~/.myprogram/config.file 中并让程序在那里检查。作为为您的用户提供的服务,由您决定如果没有找到该怎么做——也许从其他地方复制一个默认配置,或者生成一个默认配置,或者使用硬编码的默认选项,或者显示一个配置向导,或者只是失败。这完全取决于您。

    如果它是全局的,传统的将它放在 Linux 上的地方是 /etc,例如/etc/config.file 或 /etc/myprogram/config.file。见Linux File System Structure。在 Linux 上,您通常总是有一个 /etc。处理文件不存在的情况与上述相同 - 没有“正确”的方法来处理它,它纯粹基于您希望为用户提供的便利程度。

    我通常对全局配置文件做的是在安装时将它们放在 /etc/wherever 中,让程序默认从 /etc/wherever 加载配置文件,但也提供一个命令行选项来覆盖配置文件(特别适用于测试或其他情况)。

    我通常如何处理丢失的配置文件完全取决于应用程序。我通常要么有硬编码的默认值(如果合适的话),要么干脆失败并将用户引导到一些描述配置文件的文档(我发现在我的安装程序安装配置文件的情况下就足够了)。

    希望对您有所帮助。

    【讨论】:

    • “命令行选项”+1 - 我在回答中遗漏了一些东西。
    • 其实别忘了环境变量。对于测试、示例安装、可重定位安装等,您无法击败环境变量。为了支持可重复的构建,我们有一个 Git 存储库,其中包含我们需要的许多 3rdparty 软件,并且因为任何给定的用户都可能在任何地方创建他们的本地 git 工作区,我们需要可重定位的东西。如果软件支持环境变量来指定配置所属的位置,您可以围绕它编写一个小的 shell 脚本包装器,适当地设置环境变量,然后调用真实的应用程序。
    【解决方案2】:

    这取决于配置参数是什么,以及它们是“每个系统”、“每个用户”、“每个组”还是......

    系统配置通常位于/etc/... 的某个位置。在程序所在的同一目录中也是一个非常好的地方。

    用户配置,在用户的主目录中。

    组配置是最棘手的,因为您可能需要提出一个方案,其中每个“组”都有一个配置文件。 /etc/myprog/groups/<groupname>/config 或类似的东西会起作用。

    【讨论】:

      【解决方案3】:

      在 Linux 上,配置文件的通常位置是“/etc”,因此可以部署像 /etc/myprog.conf 这样的配置文件。但是,这需要root权限。其他不错的选择包括将配置文件放在用户的主目录中,使其类似于 ~/.myprog.conf~/.myprog/.conf 以使用可以拥有多个配置文件、缓存或其他您想要的东西的文件夹。

      至于可执行文件如何知道文件在哪里,一种解决方案是在几个常见位置查找文件。例如,如果您决定将配置放在用户的主目录中,请先在那里查找,如果未找到,请在/etc 下查找。并允许一个特殊的命令行参数来加载不同的配置文件。因此,比如说,调用myprog 可以检查主文件夹中的配置文件,但myprog -c /some/path/config 将使用/some/path/config 作为文件。如果任何地方都没有有效的配置文件,那么有一些默认设置也是一个好主意。

      【讨论】:

      • 默认情况下,还需要 Root 才能将文件放在 /usr/bin 中。由于他说他的应用程序在那里,这意味着他的安装程序也可以访问 /etc。
      【解决方案4】:

      配置文件可以放在任何地方,但我会尝试将它与程序将读取或写入的任何其他文件放在同一目录中。

      至于可执行文件如何找到它,我会在命令行上将配置文件的路径作为参数传递给可执行文件,默认值为“。” (这是当前目录,即您启动可执行文件时所在的目录)。

      【讨论】:

      • 但配置文件始终是必需的,我想避免每次都将其作为参数传递。我可以将它们放在 /etc/myprogram/ 中吗?我不确定执行此操作的标准方法是什么。
      • @everitt:答案说默认路径是“.”,这意味着您不必每次都将其作为参数传递。
      • @everitt:标准方法是将它们放在 /etc/myprogram 中。
      • @Mooing Duck:“.”的默认路径并不总是最好的主意,因为它取决于应用程序启动时的当前工作目录。如果他将程序放在 /usr/bin 中,这意味着他想从命令行上的任何位置运行它,这意味着配置文件必须位于用户启动它的任何目录中——这可能是不受欢迎的行为。这也必须考虑,例如,从 .desktop 链接开始,必须注意将启动目录设置为已安装文件的位置。最好将它放在一个已知的绝对路径中,并带有覆盖选项。
      • @Beta:Linux 专门为此目的提供了 /etc 目录。
      猜你喜欢
      • 2020-11-13
      • 2014-12-23
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2016-04-03
      相关资源
      最近更新 更多