Pergunta

OK, então não quero iniciar uma guerra santa aqui, mas estamos tentando consolidar a maneira como lidamos com nossos arquivos de configuração de aplicativos e estamos lutando para tomar uma decisão sobre a melhor abordagem a seguir .No momento, cada aplicativo que distribuímos usa seus próprios arquivos de configuração ad-hoc, sejam arquivos de propriedades (estilo ini), XML ou JSON (uso interno apenas no momento!).

A maior parte do nosso código é Java no momento, então estamos analisando Configuração do Apache Commons, mas descobrimos que é bastante detalhado.Também vimos XMLBeans, mas parece muita confusão por aí.Também sinto que estou sendo empurrado para o XML como formato, mas meus clientes e colegas estão apreensivos em tentar outra coisa.Posso entender da perspectiva do cliente, todo mundo já ouviu falar em XML, mas no final das contas, não deveria estar usando a ferramenta certa para o trabalho?

Quais formatos e bibliotecas as pessoas estão usando em sistemas de produção atualmente, alguém está tentando evitar o imposto sobre colchetes angulares?

Editar: realmente precisa ser uma solução multiplataforma:Linux, Windows, Solaris etc.e a escolha da biblioteca usada para fazer interface com os arquivos de configuração é tão importante quanto a escolha do formato.

Foi útil?

Solução

XML XML XML XML. Estamos falando arquivos config aqui . Não existe o "imposto cantoneira" se você não está a serialização de objetos em uma situação de desempenho intenso.

Arquivos de configuração deve ser legível e humano compreensível, além de legível por máquina. XML é um bom compromisso entre os dois.

Se a sua loja tem pessoas que estão com medo de que novos e desnecessários tecnologia XML, eu me sinto mal para você.

Outras dicas

YAML, pela simples razão de que ele faz para arquivos de configuração muito legíveis em comparação com XML.

XML:

<user id="babooey" on="cpu1">
    <firstname>Bob</firstname>
    <lastname>Abooey</lastname>
    <department>adv</department>
    <cell>555-1212</cell>
    <address password="xxxx">ahunter@example1.com</address>
    <address password="xxxx">babooey@example2.com</address>
</user>

YAML:

    babooey:
        computer : cpu1
        firstname: Bob
        lastname: Abooey
        cell: 555-1212
        addresses:
            - address: babooey@example1.com
              password: xxxx
            - address: babooey@example2.com
              password: xxxx

Os exemplos foram levados desta página: http: // www. kuro5hin.org/story/2004/10/29/14225/062

Primeiro: Esta é uma questão debate realmente grande, não uma rápida Q + A

.

O meu direito favorito agora é incluir simplesmente Lua , porque

  • posso permitir coisas como width = altura * (1 + 1/3)
  • Eu posso fazer funções personalizadas disponíveis
  • Eu posso proibir que qualquer outra coisa. (Em impossível, por exemplo, Python (incluindo pickles.))
  • I provavelmente vai querer uma linguagem de script em outro lugar no projeto de qualquer maneira.

Outra opção, se há uma grande quantidade de dados é usar sqlite3 , porque eles são direito de reivindicação

  • pequeno.
  • rápida.
  • confiável.

Escolha qualquer três.

Para que eu gostaria de acrescentar:

  • backups são uma pressão. (Basta copiar o arquivo db.)
  • mais fácil de mudar para outro db, ODBC, qualquer que seja. (Que é a partir fugly-file)

Mas, novamente, este é um problema maior. Uma resposta "grande" a este provavelmente envolve algum tipo de matriz de recurso ou a lista de situações como:

quantidade de dados, ou curto tempo de execução

  • Para grandes quantidades de dados, você pode querer armazenamento eficiente, como um banco de dados.
  • Para pequenas tiragens (muitas vezes), você pode querer algo que você não precisa fazer um monte de análise para, considere algo que pode ser mmap: Ed. In directamente

O que a configuração relacionar?

  • Anfitrião:
    • I como YAML em / etc. Se que reimplantado no windows?
  • Usuário:
    • Você permitir que os usuários editar configuração com editor de texto?
    • Caso seja centralmente manejável? Registro / gconf / db remoto?
    • Maio o usuário tem vários diferentes perfis ?
  • Project:
    • arquivo (s) no diretório do projeto? (O controle de versão geralmente segue este modelo ...)

Complexidade

  • Existem apenas alguns valores Flat? Considere YAML.
  • Os dados são aninhados, ou dependente de alguma forma? (Este é onde fica interessante.)
  • Pode ser uma característica desejável para permitir alguma forma de scripting?
  • Os modelos podem ser vistos como uma espécie de arquivos de configuração ..

Sem iniciar uma nova guerra santa, os sentimentos do post 'ângulo suporte de imposto' é uma área onde eu majoritariamente discordam com Jeff. Não há nada de errado com XML, é razoavelmente legível (tanto quanto YAML ou JSON ou arquivos INI são) mas lembre-se a sua intenção é a de ser lido por máquinas. A maioria dos combos idioma / quadro vem com um analisador XML de algum tipo de graça que torna XML uma boa escolha bonita.

Além disso, se você estiver usando uma boa IDE como o Visual Studio, e se o XML vem com um esquema, você pode dar o esquema para VS e magicamente você começa intellisense (você pode obter um para NHibernate por exemplo).

Ulimately você precisa pensar em quantas vezes você vai estar tocando esses arquivos uma vez em produção, provavelmente não que muitas vezes.

Este ainda diz tudo para mim sobre XML e porque ainda é uma opção válida para arquivos de configuração (de Tim Bray ):

"Se você quiser fornecer dados de uso geral que o receptor pode querer fazer coisas estranhas e loucas imprevistas com, ou se você quiser ser realmente paranóico e exigente quanto i18n, ou se o que você está enviando é mais como um documento de um struct, ou se a ordem das matérias de dados, ou se os dados são potencialmente longa vida (como, mais do que segundos) XML é o caminho a percorrer. Também me parece que a combinação de XML e XPath atinge um ponto ótimo para formatos de dados que precisam ser extensível; ou seja, é muito fácil de código de processamento de XML gravação que não vai falhar na presença de alterações no formato de mensagem que não toque a peça que você gosta. "

@Guy

Mas aplicativo de configuração nem sempre é apenas pares de chave / valor. Olhe para algo como a configuração tomcat para que portas que escuta. Aqui está um exemplo:

    <Connector port="80" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true" />


    <Connector port="8009" 
           enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

Você pode ter qualquer número de conectores. Definir mais no arquivo e existem mais conectores. Não definir qualquer mais e não mais existir. Não há nenhuma boa maneira (IMHO) de fazer isso com pares de chave / valor antigo simples.

Se configuração do aplicativo é simples, em seguida, algo simples como um arquivo INI que ler em um dicionário é provavelmente bem. Mas para algo mais complexo como a configuração do servidor, um arquivo INI seria uma enorme dor de manter, e algo mais estrutural, como XML ou YAML seria melhor. Tudo depende do conjunto de problemas.

Estamos usando arquivos de configuração de estilo ini. Nós usamos a biblioteca Nini para gerenciá-los. Nini torna muito fácil de usar. Nini foi planejado originalmente para .NET mas foi portado para outras plataformas utilizando Mono.

XML, JSON, INI.
todos eles têm seus pontos fortes e fracos.
Em um contexto de aplicação, eu sinto que a camada de abstração é o importante.
Se você pode escolher uma forma de estruturar os dados que são um bom meio-termo entre a legibilidade humana e como você deseja acessar / abstract os dados em código, você é ouro.

Nós principalmente usar XML onde eu trabalho, e eu realmente não posso acreditar que um arquivo de configuração carregado em um cache como objetos quando primeira leitura ou depois de ter sido escrito para, em seguida, abstraída do resto do programa, é realmente muito de uma batida em nenhum CPU nem espaço em disco.
E é bastante legível também, contanto que você estruturar o direito arquivo.

E todos os idiomas em todas as plataformas suportes XML através de algumas bibliotecas muito comuns.

@Herms

O que eu realmente queria dizer era para manter o software maneira recomendada deve armazenar valores de configuração para qualquer plataforma.

O que você muitas vezes obter, em seguida, é também as maneiras recomendadas estes devem / podem ser modificados. Como um menu de configuração em um programa ou um painel de configuração de uma aplicação "prefs sistema" (para softwares de serviços do sistema, ou seja,). Não deixar os usuários finais modificá-los diretamente através de RegEdit ou Bloco ...

Por quê?

  1. Os usuários finais (= clientes) são usadas para suas plataformas
  2. Sistema de backups pode melhor Salvar "configurações de segurança" etc

@ninesided

Sobre " escolha de biblioteca ", tente link (ligação estática) qualquer biblioteca selecionado para diminuir o risco de entrar em uma versão de conflitos de guerra em máquinas de usuários finais.

Se o seu arquivo de configuração é write-once, read-only-at-inicialização, e seus dados é um monte de pares de valores nome, sua melhor escolha é o seu desenvolvedor pode começar a trabalhar em primeiro lugar.

Se os seus dados é um pouco mais complicado, com assentamento etc, você é provavelmente melhor fora com YAML, XML, ou SQLite.

Se você precisa de dados aninhados e / ou a capacidade de consultar os dados de configuração após a inicialização, XML uso ou SQLite. Ambos têm muito boas linguagens de consulta (XPath e SQL) para dados estruturados / aninhadas.

Se os dados de configuração é altamente normalizada (forma normal por exemplo, 5) que você é melhor fora com SQLite porque o SQL é melhor para lidar com dados altamente normalizado.

Se você está planejando para escrever para o conjunto de dados de configuração durante o funcionamento do programa, então você é melhor fora de ir com SQLite. Por exemplo, se você está baixando os dados de configuração de outro computador, ou se você está baseando futuras decisões a execução do programa em dados coletados na execução do programa anterior. implementos SQLite um mecanismo de armazenamento de dados muito robusta que é extremamente difícil para corromper quando você tem falta de energia ou programas que estão pendurados em um estado inconsistente devido a erros. leads de dados corruptíveis para os custos de suporte de alto campo e SQLite vai fazer muito melhor do que qualquer solução de home-grown ou mesmo bibliotecas populares em torno de XML ou YAML.

Confira minha página para obter mais informações sobre SQLite.

Tanto quanto eu sei, o registro do Windows não é a forma preferida de armazenamento de configuração, se você estiver usando o .NET - a maioria das aplicações agora fazer uso de System.Configuration [1, 2]. Uma vez que este também é baseado em XML parece ser que tudo está se movendo na direção do uso de XML para configuração.

Se você quiser ficar multi-plataforma, eu diria que o uso de algum tipo de um arquivo de texto seria o melhor caminho a percorrer. Quanto à formatação do referido arquivo, você pode querer ter em conta se um ser humano vai ser manipulá-lo ou não. XML parece ser um pouco mais amigável para manipulação manual de arquivos INI devido à estrutura visível do arquivo.

Como para o imposto cantoneira - Eu não me preocupo sobre isso muitas vezes como as bibliotecas XML cuidar de abstrair-lo. A única vez que ele pode ser uma consideração é se você tem muito pouco espaço de armazenamento para trabalhar e contagens de cada byte.

[1] System.Configuration Namespace - http: // MSDN .microsoft.com / en-us / library / system.configuration.aspx

[2] Usando arquivos de configuração do aplicativo no .NET - http: // www.developer.com/net/net/article.php/3396111

Estamos usando arquivos de propriedades, simplesmente porque Java apoia-los nativamente. Um par de meses atrás eu vi que SpringSource Application Platform usa JSON para configurar seu servidor e parece muito interessante. I compararam várias notações de configuração e chegou à conclusão de que XML parece ser o melhor ajuste no momento. Ele tem boas ferramentas de apoio e é bastante independente de plataforma.

Re: O comentário de epatel

Eu acho que a pergunta original foi perguntando sobre configuração de aplicativo que um administrador estaria fazendo, e não apenas armazenar as preferências do usuário. As sugestões que você deu parecer mais para prefs usuário do que de configuração do aplicativo, e não são geralmente algo que o usuário nunca iria lidar com diretamente (o aplicativo deve fornecer as opções de configuração na interface do usuário e, em seguida, atualizar os arquivos). Eu realmente espero que você nunca faria o usuário tem que ver / editar o registro. :)

Quanto à questão real, eu diria que XML é provavelmente OK, como muitas pessoas serão utilizados para usando que para a configuração. Enquanto você organiza os valores de configuração em uma forma de fácil utilização, em seguida, o "imposto cantoneira" não deve ser muito ruim.

Talvez um pouco de uma tangente aqui, mas minha opinião é que o arquivo de configuração deve ser lido em uma tabela de dicionário / hash de valor de chave quando o aplicativo é iniciado pela primeira vez e sempre acessado através deste objeto a partir de então para a velocidade. Normalmente tabela de chave / valor começa como string para funções de cadeia, mas auxiliares no objeto fazer coisas tais DateTime GetConfigDate (key string) etc ...

Eu acho que a única coisa importante é escolher um formato que você preferir e pode navegar rapidamente. XML e JSON são ambos os formatos finos para configurações e são amplamente apoiada - implementação técnica não está no cerne da questão, methinks. É 100% sobre o que torna a tarefa de arquivos de configuração mais fácil para você.

Eu comecei usando JSON, porque eu trabalho um pouco com ele como um formato de transporte de dados, e os serializers torná-lo fácil de carregar em qualquer estrutura de desenvolvimento. Acho JSON mais fácil de ler do que XML, o que torna o manuseio vários serviços, cada um usando um arquivo de configuração que é modificado com bastante freqüência, que muito mais fáceis para mim!

O que plataforma você está trabalhando? Eu recomendo a tentar utilizar o método preferido / comum para ele.

  1. MacOSX - plists
  2. Win32 - Registro (ou há um novo aqui, há muito tempo eu desenvolvi sobre ele)
  3. Linux / Unix - ~ / .apprc (nome-valor talvez)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top