в Perl, используя Appconfig, я хочу иметь возможность включить файл cfg в другой файл конфигурации - PullRequest
1 голос
/ 11 ноября 2011

Я провел много исследований, но не повезло ...

Я хочу иметь файл конфигурации с некоторыми значениями по умолчанию или общими значениями.Затем попросите другие конфигурационные файлы ВКЛЮЧИТЬ эту конфигурацию по умолчанию и, при необходимости, перезапишите переменные.

пример:

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 использует тот же tmp_dir, определенный в default.cfg, но определяет «имя» ипереопределяет bin dir.

Ну, этот пример очень прост, но у меня есть конфиги gizillion, которые имеют одинаковые строки cfg, но немного отличаются, и я пытаюсь объединить конфиги.

Мое приложение на Perl и уже использует AppConfig .

Заранее благодарю за любую помощь.

Ответы [ 3 ]

1 голос
/ 11 ноября 2011

Config::General должен быть в состоянии справиться с этим, но если вы хотите придерживаться AppConfig, просто создайте подкласс, который предварительно обрабатывает файл конфигурации, путем ручной обработки включает, скажем, s/_my_special_include_syntax = (.+)$/IncludeThis($1)/ge; afaik, это должно работать без каких-либо других модификаций, так как последнее назначение выигрывает, таким образом, последнее назначение переопределяет значения по умолчанию

1 голос
/ 11 ноября 2011

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
0 голосов
/ 08 февраля 2018

Поздний ответ, но я обнаружил, что 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 found\n";

// 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
} 

Или вы можете поместить файлы в каталог config.d и обработать все в алфавитном порядке.

...