簡(jiǎn)介
可透明地從各種不同類型的文件中加載配置信息;如:JSON,XML妈候,YAML楚里,INI等
use Config::Any;
my $cfg = Config::Any->load_stems({stems => \@filepath_stems, ... });
# or
my $cfg = Config::Any->load_files({files => \@filepaths, ... });
for (@$cfg) {
my ($filename, $config) = %$_;
$class->config($config);
warn "loaded config from file: $filename";
}
Config::Any
為perl的應(yīng)用程序提供了一種從不同類型的配置文件加載配置信息的方法。它支持的文件格式有:XML、YAML、JSON、INI赛惩、Perl代碼.
這個(gè)模塊的基本原理如下 :
Perl程序會(huì)部署到不同的平臺(tái)并且會(huì)運(yùn)行在很多不同的系統(tǒng)環(huán)境下。系統(tǒng)管理員和最終用戶可能比開(kāi)發(fā)人員更喜歡不同的配置格式趁餐。多種格式的配置文件可以有很大的靈活性讓用戶做出不同的選擇喷兼,而開(kāi)發(fā)人員并沒(méi)有增加額外的工作量。作為開(kāi)發(fā)人員后雷,只需要學(xué)習(xí)如何使用一個(gè)接口讓不同格式的配置文件在適合的時(shí)間被加載季惯。
接口
load_files(%args)
Config::Any->load_files( { files => \@files } );
Config::Any->load_files( { files => \@files, filter => \&filter } );
Config::Any->load_files( { files => \@files, use_ext => 1 } );
Config::Any->load_files( { files => \@files, flatten_to_hash => 1 } );
load_files()
嘗試從參數(shù)中給出的文件列表(files)中加載配置文件,前提是文件存在臀突。
如果參數(shù)
filter
存在勉抓,它會(huì)被當(dāng)作一個(gè)回調(diào)方法(callback),被用來(lái)處理加載后返回之前的配置項(xiàng)候学。一個(gè)hash-reference 參數(shù)被傳遞給它藕筋。
如果參數(shù)
use_ext
參數(shù)被定義,加載程序?qū)L試解析每個(gè)文件的擴(kuò)展名梳码,并跳過(guò)不能與標(biāo)準(zhǔn)的插件擴(kuò)展名相匹配的文件隐圾。只有與標(biāo)準(zhǔn) 的插件擴(kuò)展名相匹配的文件才會(huì)使用對(duì)應(yīng)的插件進(jìn)行解析。出于效率的原因掰茶,這是被鼓勵(lì)使用的暇藏。但是這也將失去靈活性。例如:一個(gè)文件命名為myapp.cfg 內(nèi)容是 YAML 數(shù)據(jù)濒蒋,這時(shí)它不會(huì)被 YAML 的插件解析叨咖,因?yàn)橹挥?.yml 或 .yaml 類型的文件才會(huì)被 YAML 插件解析。
當(dāng)
flatten_to_hash
參數(shù)被定義時(shí),加載器會(huì)返回一個(gè)以文件名為鍵甸各、以內(nèi)容為值的哈希,而不是返回一個(gè)單鍵哈希的列表焰坪。
load_files()
還可以接受一個(gè)名為force_plugins
的參數(shù)趣倾,它的值應(yīng)該是一個(gè)以插件名為元素的arrayref。它的作用是允許你使用一個(gè)非標(biāo)準(zhǔn)的擴(kuò)展名某饰,并指定一個(gè)特定的解析器來(lái)處理他儒恋,此配置項(xiàng)與use_ext
不兼容。
你還可以提供一個(gè)
driver_args
hashref 傳遞給個(gè)別的解析對(duì)象黔漂。如下代碼:
Config::Any->load_files( { files => \@files, driver_args => {
General => { -LowerCaseNames => 1 }
} )
load_stems(%args)
Config::Any->load_stems( { stems => \@stems } );
Config::Any->load_stems( { stems => \@stems, filter => \&filter } );
Config::Any->load_stems( { stems => \@stems, use_ext => 1 } );
Config::Any->load_stems( { stems => \@stems, flatten_to_hash => 1 } );
load_stems
首先遍歷所有可用插件诫尽,把插件可處理的所有擴(kuò)展名與stems
列表中給出的沒(méi)有擴(kuò)展名的文件相結(jié)合生成一個(gè)插件可處理的文件列表。然后它將調(diào)用load_files
對(duì)生成的文件列表進(jìn)行處理炬守。
sub load_stems {
my ( $class, $args ) = @_;
unless ( $args && exists $args->{ stems } ) {
warn "No stems specified!";
return;
}
my $stems = delete $args->{ stems };
my @files;
for my $s ( @$stems ) {
for my $ext ( $class->extensions ) {
push @files, "$s.$ext";
}
}
$args->{ files } = \@files;
return $class->_load( $args );
}
finder()
這個(gè)方法
finder
返回 Module::Pluggable::Object 對(duì)象 用來(lái)加載插件牧嫉。
plugins()
這個(gè)方法
plugins
通過(guò)使用 Module::Pluggable::Object 模塊的對(duì)象 得到配置文件加載器插件的名稱。
extensions()
這個(gè)方法
extensions
返回插件可處理的所有可能的擴(kuò)展名减途。如果你設(shè)置了use_ext
那么load_stems
和load_files
都需要用到它酣藻。