【发布时间】: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