我做了很多研究,但是运气不好…
我想有一个配置文件与一些默认或通用值在它。然后让其他配置文件包含默认配置,并在需要时覆盖变量。
的例子:
Default.cfg:
[${name}]
bin = /bin/1
tmp_dir = /tmp
tmp_file = /tmp/${name}_tmp_file
------------------------------
myProc.cfg :
name = Test_proc
[${name}]
bin = /bin/TEST
这样,myProc.cfg使用与default.cfg中定义的相同的tmp_dir,但定义了"名称"并重新定义了bin dir。
嗯,这个例子很简单,但我有无数的配置,共享相同的cfg行,但有一点不同,我正试图整合配置。
我的应用程序是在Perl和已经使用AppConfig。
提前感谢您的任何帮助。
Config::General
应该能够处理这个问题,但是如果您希望坚持使用AppConfig
,只需创建一个子类,通过手动处理包含(例如s/_my_special_include_syntax = (.+)$/IncludeThis($1)/ge;
)来预处理配置文件Afaik,这应该在没有任何其他修改的情况下工作,因为最后一个赋值获胜,因此,最后一个赋值覆盖默认值
YAML可以在一个文件中处理多个"文档"。因此可以使用YAML来分离几个AppConfig
文档。
我还没有真正地深入到AppConfig中,但是像下面这样的东西——在调整后——应该可以工作。
use strict;
use warnings;
use English qw<$RS>;
use YAML qw<LoadFile>;
sub open_strings {
my @results = map {
open( my $h, '<', $_ );
$h;
} @_;
return wantarray ? @results
: @_ == 1 ? $results[0]
: @results
;
}
my @cfgs
= map { my $c = AppConfig->new(); $c->file( $_ ); $c }
open_strings( LoadFile( $fh_or_fname ))
;
下面的代码显示了如何将它们划分为文档,和,您甚至可能不必这样做。第三个文档是文件到文本的映射。
--- |
[${name}]
bin = /bin/1
tmp_dir = /tmp
tmp_file = /tmp/${name}_tmp_file
--- >
name = Test_proc
[${name}]
bin = /bin/TEST
---
Default.cfg : |
[${name}]
bin = /bin/1
tmp_dir = /tmp
tmp_file = /tmp/${name}_tmp_file
Myproc.cfg : |
name = Test_proc
[${name}]
bin = /bin/TEST
一个迟来的答案,但是我发现AppConfig可以多次运行。
为了发布我的文件,我将所有的登录/密码移到了configfile.ini.secret中,并在configfile.ini中留下了示例登录/密码
$config->define("configFile=s", {DEFAULT=>$dirname."/eversolar.ini"});
$config->args();
// Configfile must exist
-e $config->configFile or die "Configfile '", $config->configFile, "' not foundn";
// read configfile
$config->file($config->configFile);
pmu_log("Severity 3, Configfile is: " . $config->configFile . "n");
// Look for secret file
$config->configFile($config->configFile.".secret");
if (-e $config->configFile) {
$config->file($config->configFile);
pmu_log("Severity 3, Configfile is: " . $config->configFile . "n");
}
不只是硬编码.secret,您可以通过将下一个文件的名称放在前一个文件的名称中来将文件串起来。
类似于(perl语法可能是错误的)
$configFile = $config->configFile;
while (-e $configfile) {
$config->configFile(""); //do not read any more files
$config->file($configFile); //after this one.
$configFile = $config->configFile; // unless the next one is set in this
}
或者你可以把文件放在配置文件中。