Il modo migliore per salvare le impostazioni dell'applicazione


17

In Windows il modo predefinito è il registro. Ciò consente di differenziare le impostazioni a livello di sistema e per utente.

In Unix dovresti usare i file di testo nella cartella / etc per le impostazioni a livello di sistema (qual è la convenzione per le impostazioni per utente?).

Molti nuovi programmi (e soprattutto quelli progettati per essere portatili) utilizzano file XML.

  • Qual è il modo migliore (e la posizione) per memorizzare le impostazioni non BLOB?
  • Dovremmo seguire ogni sistema predefinito o avere una soluzione unificata?
  • E qual è il miglior modo portatile ?

Si prega di essere molto specifici su ciò che si intende con "migliore".

3
@ Thorbjørn: migliore agg \ ˈbest \ superlativo del bene
Wizard79

3
rimarrai stupito dalla diversità dei significati di "migliore" sui siti StackExchange.

Risposte:


23

Qual è il modo migliore (e la posizione) per memorizzare le impostazioni non BLOB?

Su Windows, sembra accettabile usare il registro. A mio avviso, il registro era un sistema mal concepito, e invece Users\Username\AppDatadovrebbe essere preferito un semplice file di testo nella directory. È più facile eseguire il backup, meno pericoloso per gli utenti da modificare e più facile da pulire.

Su Linux e la maggior parte degli Unix, la posizione preferita è /home/user/.config/appnameper le impostazioni specifiche dell'utente e /etc/per le impostazioni globali (a livello di sistema). La posizione meno preferita (ma accettabile) per le impostazioni dell'utente è ~/.appname, ma in genere non è più favorevole. Questi file dovrebbero essere modificabili dall'utente, quindi è sempre preferibile un formato leggibile dall'uomo.

Non sono d'accordo con la maggior parte delle persone sul fatto che XML sia un formato accettabile per l'archiviazione di dati non BLOB. È, a mio avviso, un formato eccessivamente complesso ed eccessivamente complesso per quelli che di solito finiscono per essere piccoli frammenti di dati strutturati. Preferisco vedere i file in YAML, JSON, ASN.1, coppie nome = valore o formati simili. Avere troppa sintassi rende troppo facile per un utente sbagliare e lasciare il file in un formato non valido.

Dovremmo seguire ogni sistema predefinito o avere una soluzione unificata?

Dipende interamente da te, ma tieni a mente alcune cose:

  • Piattaforme come * nix hanno limiti severi su quali posizioni sono scrivibili. Più severo di Windows. Così:
    • L'unico posto in cui dovresti scrivere su qualsiasi cosa è nella home directory dell'utente.
    • A meno che l'applicazione non sia un servizio di sistema; nel qual caso, tutti i file di dati mutabili devono essere scritti /var/. I file di dati non mutabili devono essere conservati nella directory dell'app in /usr/share/o /usr/local/share/o/opt/
    • I file di configurazione in non/etc/ devono mai essere scritti dall'applicazione quando è in esecuzione, anche se ha accesso in scrittura ad essi. /etc/dovrebbe essere il repository per comportamenti predefiniti e nient'altro.
    • Piano per l'applicazione per essere installato in uno dei tre posti: /usr/local/, /opt/appnameo /home/username/appname.
    • I BLOB devono essere archiviati insieme ad altri file di configurazione se devono essere modificati. È generalmente preferibile utilizzare un formato modificabile dall'utente, quindi si preferisce qualcosa come SQLite o Berkeley DB (poiché ci sono strumenti da riga di comando per ciascuno), ma non è necessario.
  • Su Windows, le tue applicazioni dovrebbero sempre e solo scrivere nella directory User. La posizione standardizzata per i file di dati è Users\User\AppData. In nessun altro posto sembra accettabile.
  • Su Mac OS X, le impostazioni dell'applicazione devono essere archiviate ~/Library/Preferencesinsieme a tutti i file plist delle altre applicazioni. plistsembra essere il formato preferito, ma ti consigliamo di ricontrollare con le linee guida di Apple.

E qual è il miglior modo portatile?

Non c'è "il meglio", a dire il vero. Esistono solo limitazioni e aspettative specifiche della piattaforma. La mia raccomandazione è di attenersi a mezzi specifici della piattaforma, anche se significa scrivere più codice.


1
Penso che Microsoft abbia scoraggiato l'uso del registro da alcuni anni, il che è positivo. Scrivere su AppData, come hai detto, è la strada da percorrere. In .NET (forse anche nell'API di Windows?) C'è persino un metodo che restituisce il percorso corretto.
MetalMikester,

C'è anche una variabile d'ambiente:%APPDATA%
greyfade,

@MetalMikester - sì, assolutamente perfetto. AppData è supportato dal profilo comune anche per un ambiente di dominio.
JBR Wilkinson,

settings! = config
Yousha Aleayoub

> In my opinion, the registry was a poorly-devised system, and instead a simple text file in the Users\Username\AppData directory should be preferred. @greyfade - Lo sviluppatore API Windows di lunga data, Raymond Chen, affronta questo problema e spiega perché l'uso dei file di testo nel registro non è un modello di progettazione migliore: perché i file INI sono deprecati a favore del registro
Mick

8

In Windows, utilizzare %APPDATA%\appname. Sotto * NIX, utilizzare ~/.appname. Non utilizzare nomi di directory fissi su entrambe le piattaforme, poiché la home directory dell'utente può essere diversa da quella predefinita (ad esempio, potrebbe trovarsi sulla rete).

Per quanto riguarda il formato, usa tutto ciò che ritieni sia il migliore. Questa è una decisione che solo tu puoi prendere nel contesto della tua domanda. Non è necessario, e anzi, sconsigliabile avere un modo "standard" di farlo, se quel modo "standard" non è la cosa migliore per il tuo particolare programma.

Ad esempio, XML / JSON potrebbe essere un buon modo per archiviare i dati / la configurazione dell'utente se l'applicazione utilizza già XML / JSON per qualcos'altro. Ma se si tratta di un semplice file di configurazione, perché aggiungere bloat alla tua app introducendo una dipendenza? In tal caso, probabilmente è meglio usare un semplice file di testo con delle var: value\nrighe.

EDIT: Non esiste un modo "migliore" portatile, poiché i sistemi operativi usano convenzioni molto diverse per questo. Non rompere gli standard del sistema operativo senza una buona ragione insanguinata.

EDIT2: se ti ritrovi a effettuare un'impostazione a livello di sistema in /etco HKEY_LOCAL_MACHINE, chiediti se l'impostazione è davvero globale. Quindi attendere 5 minuti e chiedersi di nuovo. Se la risposta è ancora sì, allora crea un'impostazione globale. Ricorda che un utente normale non ha accesso in scrittura /etco, HKEY_LOCAL_MACHINEe facendo questo, stai assicurando che qualcuno senza diritti di amministratore non possa installare la tua app.


Il primo paragrafo consente di utilizzare Path.Combine o qualcosa di simile e quindi impostare la posizione radice relativa una volta su% APPDATA% o ~ e lasciare che il codice faccia il resto, per EDIT2 in effetti non esiste una soluzione multipiattaforma che conosco di. Forse ci sono persone che hanno scritto una libreria di configurazione multipiattaforma a tale scopo, sarebbe almeno una bella idea ...
Tamara Wijsman,

1
@TomWij: Sicuramente qualsiasi sviluppatore competente dovrebbe essere in grado di capire che non è necessario usare letterali ovunque;). Ecco a cosa servono le variabili.
Chinmay Kanchi,

1
~/.config/applicatonsta diventando sempre più la posizione preferita su * nix.
Greyfade,

@greyfade: non l'ho mai realizzato, ma hai ragione. Sulla mia macchina, circa un quarto delle applicazioni in cui sono archiviati i dati di configurazione lo ~fanno ~/.config/appname.
Chinmay Kanchi,

Un sacco di app usa ~ / .appname in Windows (che equivale alla dir del tuo profilo utente, NON ai documenti) ed è così fastidioso. Quelle cartelle non si nascondono!
Alan Pearce,

3

Cerco di tenere fuori del Registro di sistema, è modo più utilizzati. Vorrei che lo facessero tutti.

Mi piace mantenere i file di configurazione XML o un file bin o occasionalmente un database locale (SQLite).


+1 per tenere fuori dal registro. Non riesco a trovarlo ora, ma mi sembra di aver letto che qualcuno alla MS aveva ammesso che il registro era un errore.
Chinmay Kanchi,

1
Accetto con te tranne la parte XML. Vorrei usare ini (o semplice file di testo) per requisiti di impostazione semplici e SQLite per app complesse.
Codismo,

Lo stanno ammettendo proprio ora? Potrei dirtelo nel 1995! Mac OS Classic ha funzionato correttamente: una cartella Preferenze per offrirti un posto centralizzato in cui archiviare le informazioni di configurazione, con ogni app che salva nel proprio file. Quando ho visto il Registro per la prima volta, ero tipo "Microsoft non ha mai sentito parlare di non mettere tutte le uova nello stesso paniere?!?"
Mason Wheeler,

1
Penso che sia un posto per mettere le impostazioni del sistema operativo (come la registrazione delle estensioni di file, ecc.), Va bene. Ma se Microsoft lo avesse pubblicato come API di sola lettura, probabilmente sarebbero stati citati in giudizio e avrebbero dovuto renderlo comunque scrivibile.
µBio

@Chinmay, @Mason, il registro non è un errore perché il registro fa molto di più che archiviare i dati di configurazione (vedi: criteri di gruppo, domini, replica). L'errore è come Microsoft lo ha lanciato agli sviluppatori e la mancanza di buoni standard su come usarlo. È diventato una discarica per i dati delle app, il che non è mai stato concepito.
Matt Olenik,

3

La mia risposta è una combinazione di di Chinmay Kanchi risposta e di BioBuckyBall risposta .

XML / Json per configurazioni semplici, SQLite per configurazioni complesse e più grandi parcheggiate nella cartella dell'applicazione OS predefinita o nella cartella utente OS predefinita quando le configurazioni dipendono dall'utente. Entrambi potrebbero essere usati.


2

In Windows, terrei le impostazioni dell'applicazione nella AppDatacartella


1

Le impostazioni dell'utente sono di solito in

/home/<user>/.<application> 

Ad esempio, per le impostazioni di irssi sono /home//.irssi/config


Ma questa è una convenzione Unix. Che mi dici di Windows? E in Linux, la directory home dell'utente non viene inondata di sottodirectory? Perché no /home/<user>/etc/application?
Wizard79,

@Lorenzo: inondare raramente la home directory dell'utente è un problema.
Chinmay Kanchi,

1
Le impostazioni di configurazione vengono sempre più spostate ~/.config/applicationper aiutare a mantenere le cose consolidate. Sono propenso a concordare con questo movimento.
Greyfade,

1
@Lorenzo: è esattamente lo stesso della convenzione di Windows per l'archiviazione dei file di configurazione AppData.
Greyfade,

1
@Chris: assolutamente no! :-)
Wizard79,

1

Penso che sia meglio usare il meccanismo preferito specifico per la piattaforma. Ad esempio, su OS X, il meccanismo preferito è posizionare un elenco di proprietà in ~ / Libreria / Preferenze e l'API Cocoa ha un'interfaccia davvero semplice per archiviare e recuperare le impostazioni da lì.

Se la tua app è multipiattaforma, puoi eliminarla con una classe o altro.


0

L'unica cosa che scrivo nel registro è la posizione dell'app, in modo che gli installatori e gli aggiornamenti possano trovarla facilmente. Tutto il resto è archiviato in file in / AppData / Azienda / App


-2

Per le app Java penso che gson sia una buona scelta. Crea gli oggetti delle tue impostazioni e usa gson per convertirli in JSON e viceversa. Ha il vantaggio di essere leggibile dall'uomo invece di un BLOB serializzato.

Modifica: ok, quindi forse non è così generale ...


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.