É plausível usar um formato de configuração baseado em sistema de arquivos em vez de um arquivo INI?

4

Depois de ter tido incontáveis problemas com os arquivos de configuração do estilo INI e analisando-os corretamente (deixando os dados binários bem corretos), uma idéia maluca passou pela minha cabeça recentemente:

E se um arquivo INI como

# settings.ini
[Windows]
DirectorySeparator='\'
PathSeparator=';'

[Linux]
DirectorySeparator='/'
PathSeparator=':'

Preferiria ser armazenado no sistema de arquivos; cada grupo é um diretório, cada par chave / valor é um arquivo, então

settings/Windows/DirectorySeparator (contains just '\')
settings/Windows/PathSeparator      (contains just ';')
... you get the idea ...

Desvantagens:

  • Possivelmente lento devido ao trabalho de IO, mas talvez os caches do sistema de arquivos ajudem?
  • Execução baixa de inodes em alguns sistemas de arquivos?
  • Os nomes de grupo / chave podem consistir apenas em caracteres que também são válidos para nomes de arquivos / diretórios, podendo ser bastante restritivos, dependendo do FS.

Vantagens:

  • Grupos aninhados profundamente em órbita
  • Não se preocupe em escapar, os dados binários são fáceis. Basta que cada arquivo contenha os dados brutos.
  • Bloqueio automático, controle de acesso e tudo o que o sistema de arquivos fornece
  • Fácil acesso com a maioria das linguagens de programação, mesmo manualmente

Estou muito tentado a tentar isso no meu próximo projeto, me pergunto se alguém já tem experiência com essa abordagem?

    
por Frerich Raabe 13.02.2013 / 01:15
fonte

5 respostas

23

Isso seria super desagradável . Você:

  • Não seria possível vê-los todos de uma vez
  • Não seria possível inserir comentários explicando por que as coisas estão definidas da maneira como estão
  • Não seria possível ter documentação sobre o que os comandos fazem ou quais opções possíveis estão corretas na configuração
  • Isso tornaria o backup / versão controlando suas configurações mais desagradáveis.

Usar uma biblioteca para armazenar e ler coisas em arquivos XML (ugh) ou JSON ou INI é tão fácil que não há desculpa para criar outras coisas.

Os sistemas de arquivos servem para armazenar e organizar arquivos. Não abuse e crie uma alternativa de configuração semi-elaborada quando houver muitas bibliotecas de configuração disponíveis.

    
por 13.02.2013 / 01:25
fonte
8

Esta é uma maneira perfeita de representar dados em forma de árvore. Um sistema de arquivos é um banco de dados em árvore, por que reimplementar um em cima dele?

A implementação mais conhecida dessa ideia é o Registro do Windows. Sua principal falha é que ele implementa um sistema de arquivos ao lado do sistema de arquivos e não suporta a API do sistema de arquivos, o que significa que você não pode usar ferramentas do sistema de arquivos como find ou grep .

Elektra é um projeto que implementa um banco de dados de valor-chave de configuração global semelhante ao Registro do Windows de maneira portátil. Ele usa um formato de armazenamento muito semelhante ao que você descreve.

O sistema de arquivos virtual sysfs do Linux, usado para expor dados sobre o grafo do objeto kernel e alterar configurações, também usa um formato "um valor por arquivo" e usa links simbólicos extensivamente para representar dados em forma de gráfico. / p>

O servidor web Gatling usa até metadados do sistema de arquivos para configuração. Veja como você configura dois hosts virtuais:

mkdir www.example.com:80
mkdir internal.example.com:8080

Veja como você configura um redirecionamento:

ln -s http://www.google.com/mail gmail

Veja como você diz ao Gatling que um arquivo é um script do lado do servidor, ou seja, ele deve ser executado e não ser exibido:

chmod +x script

Veja como você diz ao Gatling para veicular ou não um arquivo:

chmod o+r serve_this
chmod o-r dont_serve_that

O Gatling parece ter sido inspirado no qmail.

    
por 13.02.2013 / 04:12
fonte
4

Além de uma excelente resposta fornecida por @whatsisname:

  • Não será possível criar dois elementos com o mesmo nome;
  • Não será possível compartilhar a configuração;
  • Não será possível fazer uma ordem personalizada de elementos;
  • Sistemas de arquivos diferentes têm limitações diferentes conforme os nomes de arquivos. Eles também têm nomes reservados, como CON ou NUL para Windows;
  • Além disso, os sistemas de arquivos podem diferenciar maiúsculas de minúsculas ou não.

Concordo completamente com a ideia de usar uma biblioteca pronta para trabalhar com arquivos de configuração.

Em relação à sua preocupação em armazenar grandes blocos de dados binários, a maioria das bibliotecas de configuração orientadas a banco de dados fornece esse recurso. Se for escolhida uma biblioteca que não o faça, usar uma referência de arquivo / diretório mais arquivos binários individuais parece ser a melhor idéia.

    
por 13.02.2013 / 03:21
fonte
2

Isso de fato foi feito. Por exemplo, arquivos de controle do qmail são arquivos individuais que contêm uma única linha com a configuração.

O fato de que este não é um método muito popular de configuração é suportado por razões dadas em outras respostas a essa pergunta.

    
por 13.02.2013 / 04:49
fonte
1

Aqui estão algumas considerações não mencionadas até agora, que podem ou não ser relevantes, dependendo do aplicativo para o qual você deseja usar.

Verificação de integridade da configuração

Com um único arquivo de configuração, pegue um hash criptográfico. Feito. Se for diferente da próxima vez que você ler o arquivo, você sabe que ele foi modificado manualmente ou corrompido.

Com uma configuração baseada no sistema de arquivos, você precisa percorrer a árvore inteira, lendo os itens em uma ordem especificada antes de alimentá-los um a um no hash. Não apenas o conteúdo do arquivo, mas também os nomes de diretório e arquivo. Muito algumas coisas para fazer.

Relacionado a isso,

Robustez

Mesmo se você tiver verificações de integridade, há muito mais que pode dar errado em um sistema de arquivos. Basta pensar em um usuário olhando através dos arquivos, movendo alguns arquivos / diretórios para outros locais, com seus movimentos do mouse e um dedo nervoso.

Como você lida com um link para um diretório pai que o lança em um loop infinito quando você o percorre desmarcado. Com a corrupção correta que não é verificada pelo seu aplicativo, ele pode ser renderizado completamente, exigindo uma desinstalação, limpeza manual e reinstalação.

Um backup de um arquivo de configuração corrompido é muito mais fácil de restaurar.

Falando sobre backups,

Usuários avançados e administradores

O que eles querem fazer?

  • Modifique-o de maneiras úteis, mas não é possível com as caixas de diálogo de configuração integradas.
  • Backup e restauração da configuração.
  • Exportar / importar da configuração.
  • Transfira a configuração para um amigo ou para sua segunda máquina.
  • Distribua uma configuração obrigatória para um grande número de máquinas e usuários.

Com um único arquivo de configuração baseado em texto, tudo o que você precisa já está embutido no sistema operacional: Copiar, mover e renomear arquivos, um editor de texto, copiar e colar. A transferência é tão fácil quanto anexar um arquivo a um e-mail.

Com o sistema de arquivos, tudo o que não é fornecido pelo seu aplicativo é difícil de fazer. Modificando manualmente uma opção de texto? É melhor tomar cuidado para não adicionar um End Of Line adicional. Modificando uma opção binária? Hmm, editor hexadecimal?

Transfere a configuração por email? Você precisa de ferramentas adicionais: crie um arquivo zip e anexe-o. Então, espere que as opções binárias internas não ativem o verificador de vírus de correio e que ele passe.

Para todos os efeitos práticos, uma configuração baseada no sistema de arquivos é tão boa quanto uma caixa preta para um não-programador.

EDIT: Tamanho do cluster

Um arquivo separado para cada opção pode usar bastante espaço no disco rígido. Quando cada opção de 5 bytes come um cluster completo de 64KB, e você tem muitos deles ... Faça as contas.

    
por 13.02.2013 / 22:37
fonte