【问题标题】:Is there a way to get the system configuration files folder within a Perl script?有没有办法在 Perl 脚本中获取系统配置文件文件夹?
【发布时间】:2015-07-23 21:18:41
【问题描述】:

尝试了多种方法,但尚未找到答案...

背景

我正在开发一个遗留的 Perl 应用程序,其中包含许多硬编码值,这些值应该可以根据应用程序的安装位置进行配置。因此,显然,我希望将这些值外部化到一个配置文件中,该文件可能位于几个“预期”位置之一。也就是说,使用传统的方法检查配置文件:

  • 当前工作目录,
  • 用户的主目录(或其中的子文件夹),以及
  • 系统配置目录(或其中的子文件夹)

找到的第一个获胜。

我在哪里

稍微浏览了 CPAN 站点,发现了 Config::Any 包,看起来很有希望。我可以给它一个要使用的文件列表:

use Config::Any;
my $config = Config::Any->load_files(
    {
        files => [qw(sample.conf /home/william/.config/sample.conf /etc/sample.conf)],
        use_ext => 0,
    });

这将检查每个文件是否存在,如果找到,则将内容加载到哈希引用的数组引用中。不错,但我仍然必须对搜索 sample.conf 文件的位置进行硬编码。在这里,我假设我正在使用 Linux 系统,并且该应用程序的所有用户的配置文件的位置是 /etc/。我也可以随时添加/usr/local/etc/,但无论如何,这与系统无关。

我可以使用File::HomeDir 找到用户主文件夹并在那里进行搜索,无论应用程序在哪个系统上运行,它都能正常工作。那么是否有类似的软件包可以提供/etc/ 文件夹(或其他平台上的等效文件夹)?

问题

  • 有没有办法做到这一点,而不必知道我使用的是什么特定的操作系统? (Perl 包或代码 sn-p)
  • 完成此任务的“Perl 最佳实践”方法是什么?我无法想象以前没有其他人遇到过这种情况。

【问题讨论】:

  • 您是否考虑过使用环境变量来存储位置?或者,将其作为命令行参数传递给脚本?
  • 不幸的是,它是一个遗留的 CGI 应用程序,所以我认为这些不是这里的选项。最终,我想将它迁移到 mod_perl 并在 Apache 配置中提供配置选项,但应用程序太大且没有文档,我认为不会很快发生这种情况;我坚持使用它。这只是使应用程序更“易于部署”的一个垫脚石。
  • 我要补充一点,这些选项是支持 CGI 脚本的各种软件包的一部分。
  • 为什么不将它保存在 DocumentRoot 中(或下面),或者它可以保存在文件系统中的任何位置,并在 DocumentRoot 中/下有一个指向它的符号链接?
  • DocumentRoot 可能不是最佳位置,因为该文件将包含用户和数据库凭据以及其他敏感数据。如果有人知道文件的名称,则可以从那里浏览。我真的在寻找一种方法,当我安装应用程序时,它会放置一个默认配置文件供管理员用户修改,同时保证它不被窥探。

标签: perl configuration


【解决方案1】:

除非您不打算在非基于 unix 的主机上运行您的代码,根据 conventional directory layoutfilesystem hierarchy standard,您可能会依赖大量知名的地方。

无论如何,没有什么能阻止您动态构建文件搜索规范以考虑平台的异常情况及其获取它们的特定方法(例如,File::HomeDir::Win32File::HomeDir)。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2011-02-05
    • 2011-08-09
    • 1970-01-01
    • 2021-08-08
    • 2010-10-27
    相关资源
    最近更新 更多