it-swarm-es.com

La mejor manera de guardar la configuración de la aplicación

En Windows, la forma predeterminada es el registro. Esto le permite diferenciar configuraciones de todo el sistema y por usuario.

En Unix, debe usar archivos de texto en la carpeta/etc para la configuración de todo el sistema (¿cuál es la convención para la configuración por usuario?).

Muchos programas nuevos (y especialmente aquellos diseñados para ser portátiles) usan archivos XML.

  • ¿Cuál es la mejor manera (y ubicación) para almacenar configuraciones que no sean BLOB?
  • ¿Deberíamos seguir los valores predeterminados de cada sistema o tener una solución unificada?
  • ¿Y cuál es la mejor manera portátil?
17
Wizard79

¿Cuál es la mejor manera (y ubicación) para almacenar configuraciones que no sean BLOB?

En Windows, parece aceptable usar el registro. En mi opinión, el registro era un sistema mal diseñado y, en cambio, un simple archivo de texto en el Users\Username\AppData directorio debe ser preferido. Esto es más fácil de respaldar, menos peligroso para los usuarios modificar y más fácil de limpiar.

En Linux y la mayoría de Unixes, la ubicación preferida es /home/user/.config/appname para configuraciones específicas del usuario y /etc/ para configuraciones globales (en todo el sistema). La ubicación menos preferida (pero aceptable) para la configuración del usuario es ~/.appname, pero esto generalmente está cayendo en desgracia. Estos archivos deben ser editables por el usuario, por lo que siempre se prefiere un formato legible por humanos.

No estoy de acuerdo con la mayoría de las personas en que XML es un formato aceptable para almacenar datos que no son de blob. Es, en mi opinión, un formato excesivamente complejo y excesivamente complejo para lo que generalmente termina siendo piezas muy pequeñas de datos estructurados. Prefiero ver archivos en YAML, JSON, ASN.1, pares de nombre = valor o formatos similares. Tener demasiada sintaxis hace que sea demasiado fácil para un usuario equivocarse y dejar el archivo en un formato no válido.

¿Deberíamos seguir los valores predeterminados de cada sistema o tener una solución unificada?

Eso depende totalmente de usted, pero tenga en cuenta algunas cosas:

  • Las plataformas como * nix tienen limitaciones estrictas sobre qué ubicaciones se pueden escribir. Más estricto que Windows. Entonces:
    • El único lugar donde debe escribir es el directorio de inicio del usuario.
    • A menos que su aplicación sea un servicio del sistema; en cuyo caso, todos los archivos de datos mutables deben escribirse en /var/. Los archivos de datos no mutables deben mantenerse en el directorio de su aplicación en /usr/share/ o /usr/local/share/ o /opt/
    • Archivos de configuración en /etc/ la aplicación no debe escribir nunca cuando se está ejecutando, incluso si tiene acceso de escritura. /etc/ debería ser el repositorio de predeterminado comportamientos y nada más.
    • Planifique la instalación de su aplicación en uno de estos tres lugares: /usr/local/, /opt/appname o /home/username/appname.
    • Los blobs deben almacenarse junto con otros archivos de configuración si se van a cambiar. Es generalmente preferible usar un formato editable por el usuario, por lo que se prefiere algo como SQLite o Berkeley DB (ya que hay herramientas de línea de comandos para cada uno) , pero no requerido.
  • En Windows, sus aplicaciones solo deberían escribir en el directorio de usuarios. La ubicación estandarizada para los archivos de datos es Users\User\AppData. En ningún otro lugar parece aceptable.
  • En Mac OS X, la configuración de la aplicación debe almacenarse en ~/Library/Preferences junto con todos los archivos plist de otras aplicaciones. plist parece ser el formato preferido, pero querrá verificar dos veces con las Apple directrices.

¿Y cuál es la mejor forma portátil?

No hay "mejor", para ser honesto. Solo hay limitaciones y expectativas específicas de la plataforma. Mi recomendación es seguir con los medios específicos de la plataforma, incluso si eso significa escribir más código.

23
greyfade

En Windows, use %APPDATA%\appname. En * NIX, use ~/.appname. No use nombres de directorio fijos en ninguna de las plataformas, ya que el directorio de inicio del usuario puede ser diferente del predeterminado (podría estar en la red, por ejemplo).

En cuanto al formato, use lo que considere mejor. Esa es una decisión que solo usted puede tomar en el contexto de su aplicación. Es innecesario, y de hecho, desaconsejable, tener una forma "estándar" de hacerlo, si esa forma "estándar" no es lo mejor para su programa en particular.

Por ejemplo, XML/JSON podría ser una buena forma de almacenar datos/configuración del usuario si su aplicación ya usa XML/JSON para otra cosa. Pero si se trata de un archivo de configuración simple, ¿por qué agregar hinchazón a su aplicación introduciendo una dependencia? En ese caso, probablemente sea mejor usar un archivo de texto simple con var: value\n líneas en su lugar.

EDITAR: No hay una "mejor" forma portátil, ya que los sistemas operativos usan convenciones muy diferentes para esto. No rompas los estándares del sistema operativo sin una buena razón.

EDIT2: Si te encuentras haciendo una configuración de todo el sistema en /etc o HKEY_LOCAL_MACHINE, pregúntese si la configuración es realmente global. Luego espere 5 minutos y pregúntese nuevamente. Si la respuesta sigue siendo sí, entonces, por supuesto, haga una configuración global. Recuerde, un usuario normal no tiene acceso de escritura a /etc o HKEY_LOCAL_MACHINE y al hacer esto, se asegura de que alguien sin derechos de administrador no pueda instalar su aplicación.

8
Chinmay Kanchi

Intento mantenerme fuera del registro, es forma sobre usado. Desearía que todos lo hicieran.

Me gusta mantener archivos de configuración xml o un archivo bin u ocasionalmente una base de datos local (SQLite).

3
µBio

Mi respuesta es una combinación de Chinmay Kanchi respuesta y BioBuckyBall's respuesta .

XML/Json para configuraciones simples, SQLite para configuraciones complejas y más grandes estacionadas en la carpeta predeterminada de la aplicación del sistema operativo o en la carpeta predeterminada del usuario del sistema operativo cuando las configuraciones dependen del usuario. Ambos podrían ser utilizados.

3
Maniero

En Windows, mantendría la configuración de la aplicación en la carpeta AppData

2
Graviton

La configuración del usuario suele estar en

/home/<user>/.<application> 

Entonces, por ejemplo, la configuración de irssi es /home//.irssi/config

1
Chris

Creo que es mejor usar el mecanismo preferido de plataforma específica. Por ejemplo, en OS X, el mecanismo preferido es colocar una lista de propiedades en ~/Library/Preferences, y la API de Cocoa tiene una interfaz realmente simple para almacenar y recuperar configuraciones desde allí.

Si su aplicación es multiplataforma, puede abstraerlo con una clase o cualquier otra cosa.

1
mipadi

Lo único que escribo en el registro es la ubicación de la aplicación, de modo que los instaladores y actualizadores puedan encontrarla fácilmente. Todo lo demás se almacena en archivos en/AppData/Company/App

0
GrandmasterB