Qual é a biblioteca de analisadores de configuração “padrão” usada no Linux?

1

Uma pergunta muito simples, mas muito difícil de encontrar.

Em um aplicativo Linux, não quero usar o analisador de configuração "meu próprio", mas use aquele que (deveria estar?) já está disponível. Simples para manter a manutenção da configuração do aplicativo simples e não adicionar bibliotecas extras.

    
por nanitous 01.05.2018 / 13:45

2 respostas

3

Realmente não há uma biblioteca de analisadores de configuração 'padrão'. Se você examinar através de /etc , você encontrará uma combinação de:

  • configuração XML
  • configuração de estilo do Windows INI
  • Basic KEY = VALUE config
  • JSON (visto principalmente com aplicativos da web).
  • YAML (principalmente visto com material mais novo, especialmente se escrito em Python).
  • Coisas que parecem JSON ou YAML ou XML, mas não são (veja, por exemplo, configuração para Nginx (parece com JSON, mas não é), Apache (parece com XML, mas não é) e Unbound ( parece YAML, mas não é).
  • Várias linguagens de shell.
  • Várias coisas que parecem com linguagens de shell, mas tecnicamente não são.
  • Snippets de origem em várias linguagens de script.
  • Possivelmente outras coisas em que não pensei.

Em relação ao que usar com seu aplicativo:

  • Por favor, o amor de todas as coisas santas evita XML. É desnecessariamente verboso, muito complicado de analisar (e, portanto, leva muito tempo e muita memória), e traz uma série de problemas de segurança. Também não é trivial obter o equilíbrio adequado entre elementos e atributos, e você geralmente acabará se arrependendo das escolhas feitas em relação a isso em algum momento posterior. A única vantagem real aqui é que você tem praticamente a garantia de ter um analisador XML em funcionamento em qualquer sistema que encontrar.
  • Arquivos INI do estilo do Windows geralmente são uma aposta segura, embora eles limitem a complexidade de suas estruturas de configuração. Muitas bibliotecas existem para isso, e seu sistema provavelmente já tem pelo menos um. Eles não são tão comuns no Linux (os arquivos de configuração clássicos são tradicionalmente pares KEY = VALUE sem cabeçalhos de seção), mas ainda são amplamente usados e fáceis de entender.
  • Basic KEY = VALUE pares (um por linha ideal) são tão triviais para analisar que você nem precisa de uma biblioteca para isso, mas são muito limitados no que eles podem fazer.
  • O
  • JSON é seguro e fácil de analisar, é amplamente suportado (praticamente todas as principais linguagens têm pelo menos um analisador atualmente) e suporta o aninhamento arbitrário de estruturas de configuração. No entanto, ele não suporta comentários (alguns analisadores podem, mas os resultados não serão interoperáveis), o que não é ótimo para arquivos projetados para serem editados com um editor de texto.
  • O YAML é o meu favorito, é razoavelmente seguro e fácil de analisar, parece muito natural para a maioria das pessoas, suporta comentários e tem uma sobrecarga mínima. A única grande coisa aqui é que a indentação realmente é importante, pois é responsável por cerca de 80% da sintaxe, que combinada com o fato de que o YAML requer espaços para recuo (sem guias) pode torná-lo um pouco de um trabalho para trabalhar se você não tiver um bom editor.
  • Se você estiver usando uma linguagem de script, considere usar snippets de origem para configuração, mas seja muito cuidadoso ao fazer isso. A menos que você seja muito cuidadoso sobre como você as analisa, você está deixando os usuários fazerem coisas arbitrárias na sua lógica interna, se quiserem, o que é um pesadelo de suporte ao cliente (você irá eventualmente levar as pessoas reclamando que você quebrou sua configuração, o que aconteceu para incluir coisas cutucando internals principais do programa que você mudou).
por 01.05.2018 / 21:48
2

Um analisador de configuração padrão que vem à mente é o código de shell usado para definir variáveis de ambiente.

Se o seu software é iniciado por algo que faz:

#! /bin/sh -
set -o allexport
for conf in /etc/default/mysoft ~/.config/mysoft.conf; do
  [ -f "$conf" ] && [ -r "$conf" ] && . "$conf"
done
unset -v conf
exec mysoft "$@"

Em seguida, seus usuários podem criar alguns ~/.config/mysoft.conf com conteúdo como:

MYSOFT_TUNABLE=foo
# even using shell code to set the values:
MYSOFT_MAX_COLUMNS=$((${COLUMNS:-$(tput cols)} / 2))

e mysoft podem consultar esses valores com getenv("MYSOFT_TUNABLE") ou API correspondente no idioma em que está escrito.

Isso é limitado ao% flat key=value , onde value é limitado a strings de caracteres não-NUL. Se você precisar de estruturas de dados mais complexas, poderá consultar o JSON ou o XML para o qual a maioria dos idiomas possui uma ou mais bibliotecas de análise.

Para softwares escritos em linguagens interpretadas (como php , perl , python ...), uma abordagem simples e muito flexível comum é simplesmente gravar arquivos de configuração como arquivos de origem nesses idiomas.

Por exemplo, para perl , crie um ~/.config/mysoft/conf.pl como:

%conf = (
  string_param => "string",
  list_param => [1, 2],
  complex_param => { foo => "bar", bar => "baz" }
);
    
por 01.05.2018 / 14:14