Beste Möglichkeit, Anwendungseinstellungen zu speichern

17

In Windows ist die Standardeinstellung die Registrierung. Auf diese Weise können Sie systemweite und benutzerspezifische Einstellungen unterscheiden.

Unter Unix sollten Sie Textdateien im Ordner / etc für systemweite Einstellungen verwenden (wie lauten die Konventionen für Benutzereinstellungen?).

Viele neue Programme (und insbesondere solche, die für den portablen Einsatz entwickelt wurden) verwenden XML-Dateien.

  • Was ist der beste Weg (und Speicherort), um Nicht-BLOB-Einstellungen zu speichern?
  • Sollten wir die Standardeinstellungen jedes Systems befolgen oder eine einheitliche Lösung haben?
  • Und was ist der beste tragbare Weg?
Wizard79
quelle
Seien Sie bitte sehr genau, was Sie mit "am besten" meinen.
3
@ Thorbjørn: best adj \ ˈbest \ superlative of good
Wizard79
3
Sie wären erstaunt über die Bedeutungsvielfalt von "best" auf StackExchange-Sites.

Antworten:

23

Was ist der beste Weg (und Speicherort), um Nicht-BLOB-Einstellungen zu speichern?

Unter Windows scheint es akzeptabel, die Registrierung zu verwenden. Meiner Meinung nach war die Registrierung ein schlecht durchdachtes System, und stattdessen sollte eine einfache Textdatei im Users\Username\AppDataVerzeichnis bevorzugt werden. Dies ist einfacher zu sichern, für Benutzer weniger gefährlich zu ändern und einfacher zu bereinigen.

Unter Linux und den meisten Unixen werden /home/user/.config/appnamebenutzerspezifische und /etc/globale (systemweite) Einstellungen bevorzugt . Der weniger bevorzugte (aber akzeptable) Ort für Benutzereinstellungen ist ~/.appname, aber dies fällt im Allgemeinen in Ungnade. Diese Dateien sollten vom Benutzer bearbeitet werden können, daher wird immer ein lesbares Format bevorzugt.

Ich bin mit den meisten Leuten nicht einverstanden, dass XML ein akzeptables Format zum Speichern von Nicht-Blob-Daten ist. Meiner Meinung nach handelt es sich um ein überarbeitetes und übermäßig komplexes Format für normalerweise sehr kleine strukturierte Daten. Ich bevorzuge es, Dateien in YAML, JSON, ASN.1, Name = Wert-Paaren oder ähnlichen Formaten zu sehen. Zu viel Syntax macht es einem Benutzer zu einfach, die Datei in einem ungültigen Format zu belassen.

Sollten wir die Standardeinstellungen jedes Systems befolgen oder eine einheitliche Lösung haben?

Das liegt ganz bei Ihnen, aber denken Sie an einige Dinge:

  • Plattformen wie * nix unterliegen strengen Einschränkungen hinsichtlich der beschreibbaren Speicherorte. Strenger als Windows. So:
    • Der einzige Ort, an den Sie schreiben sollten, ist das Home-Verzeichnis des Benutzers.
    • Es sei denn, Ihre Anwendung ist ein Systemdienst. In diesem Fall sollten alle veränderlichen Datendateien geschrieben werden /var/. Nicht veränderbare Datendateien sollten in Ihrem App-Verzeichnis in /usr/share/oder /usr/local/share/oder aufbewahrt werden/opt/
    • Konfigurationsdateien in /etc/sollten niemals von der Anwendung geschrieben werden, wenn sie ausgeführt wird, auch wenn sie Schreibzugriff darauf hat. /etc/sollte das Repository für Standardverhalten sein und sonst nichts.
    • Plan für Ihre Anwendung in einem von drei Orten installiert werden: /usr/local/, /opt/appnameoder /home/username/appname.
    • Blobs sollten zusammen mit anderen Konfigurationsdateien gespeichert werden, wenn sie geändert werden sollen. Es ist im Allgemeinen vorzuziehen , ein vom Benutzer bearbeitbares Format zu verwenden. Daher wird etwas wie SQLite oder Berkeley DB bevorzugt (da für jedes Tool Befehlszeilenprogramme vorhanden sind), dies ist jedoch nicht erforderlich.
  • Unter Windows sollten Ihre Anwendungen immer nur in das Benutzerverzeichnis schreiben. Der standardisierte Speicherort für Datendateien ist Users\User\AppData. Nirgendwo scheint das akzeptabel zu sein.
  • Unter Mac OS X sollten Ihre Anwendungseinstellungen ~/Library/Preferenceszusammen mit allen Plist-Dateien der anderen Anwendungen gespeichert werden. plistscheint das bevorzugte Format zu sein, aber Sie sollten die Apple-Richtlinien genau prüfen.

Und was ist der beste tragbare Weg?

Es gibt kein "Beste", um ehrlich zu sein. Es gibt nur plattformspezifische Einschränkungen und Erwartungen. Ich empfehle, mich an plattformspezifische Mittel zu halten, auch wenn dies bedeutet, mehr Code zu schreiben.

greyfade
quelle
1
Ich denke, Microsoft rät seit einigen Jahren von der Verwendung der Registrierung ab - was gut ist. Wie Sie bereits erwähnt haben, ist das Schreiben an AppData der richtige Weg. In .NET (vielleicht auch in der Windows-API?) Gibt es sogar eine Methode, die den richtigen Pfad zurückgibt.
MetalMikester
Es gibt auch eine Umgebungsvariable:%APPDATA%
greyfade
@MetalMikester - ja, genau richtig. AppData wird von Roaming Profile auch für eine Domänenumgebung unterstützt.
JBRWilkinson
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 - Der langjährige Windows-API-Entwickler Raymond Chen spricht dies an und erklärt, warum die Verwendung von Textdateien über die Registrierung kein besseres Entwurfsmuster darstellt: Warum werden INI-Dateien zugunsten der Registrierung abgelehnt
Mick
8

Verwenden Sie unter Windows %APPDATA%\appname. Verwenden Sie unter * NIX ~/.appname. Verwenden Sie unter keiner der Plattformen feste Verzeichnisnamen, da sich das Basisverzeichnis des Benutzers vom Standardverzeichnis unterscheiden kann (beispielsweise im Netzwerk).

Verwenden Sie für das Format das, was Sie für am besten halten. Diese Entscheidung können nur Sie im Rahmen Ihrer Bewerbung treffen. Es ist unnötig und in der Tat nicht ratsam, eine "Standard" -Methode zu verwenden, wenn diese "Standard" -Methode nicht die beste für Ihr bestimmtes Programm ist.

XML / JSON ist beispielsweise eine gute Methode zum Speichern von Benutzerdaten / -konfigurationen, wenn Ihre Anwendung XML / JSON bereits für andere Zwecke verwendet. Aber wenn es sich um eine einfache Konfigurationsdatei handelt, warum sollten Sie Ihrer App Schwung verleihen, indem Sie eine Abhängigkeit einführen? In diesem Fall ist es wahrscheinlich am besten, var: value\nstattdessen eine einfache Textdatei mit Linien zu verwenden.

EDIT: Es gibt keinen "besten" portablen Weg, da Betriebssysteme hierfür sehr unterschiedliche Konventionen verwenden. Brechen Sie nicht ohne triftigen Grund die OS-Standards.

EDIT2: Wenn Sie eine systemweite Einstellung in /etcoder vornehmenHKEY_LOCAL_MACHINE , fragen Sie sich, ob die Einstellung wirklich global ist. Warten Sie dann 5 Minuten und fragen Sie sich erneut. Wenn die Antwort immer noch Ja lautet, nehmen Sie auf jeden Fall eine globale Einstellung vor. Denken Sie daran, ein normaler Benutzer nicht über Schreibzugriff auf /etcoder HKEY_LOCAL_MACHINEund dies zu tun, sind Sie , dass jemand ohne Admin - Rechte sicherstellen , dass Ihre App nicht installieren können.

Chinmay Kanchi
quelle
Der erste Absatz erlaubt es, Path.Combine oder ähnliches zu verwenden und so den relativen Root-Speicherort einmal auf% APPDATA% oder ~ zu setzen und den Code den Rest erledigen zu lassen. Für EDIT2 gibt es in der Tat keine plattformübergreifende Lösung, die ich kenne von. Vielleicht gibt es Leute, die zu diesem Zweck eine plattformübergreifende Konfigurationsbibliothek geschrieben haben, es wäre zumindest eine gute Idee ...
Tamara Wijsman
1
@TomWij: Sicherlich sollte jeder kompetente Entwickler in der Lage sein, herauszufinden, dass Sie nicht überall Literale verwenden müssen;). Dafür sind Variablen da.
Chinmay Kanchi
1
~/.config/applicatonwird zunehmend zum bevorzugten Standort auf * nix.
Greyfade
@greyfade: Ich habe das eigentlich nie gemerkt, aber du hast recht. Auf meinem Computer ~tut dies etwa ein Viertel der Anwendungen, in denen Konfigurationsdaten gespeichert sind ~/.config/appname.
Chinmay Kanchi
Eine ganze Reihe von Apps verwenden ~ / .appname in Windows (das entspricht Ihrem Benutzerprofilverzeichnis, NICHT Dokumenten) und es ist sehr ärgerlich. Diese Ordner verstecken sich nicht!
Alan Pearce
3

Ich versuche mich aus der Registrierung herauszuhalten, es ist viel zu weit verbreitet. Ich wünschte, jeder würde.

Ich mag es, XML-Konfigurationsdateien oder eine Bin-Datei oder gelegentlich eine lokale Datenbank (SQLite) zu speichern.

µBio
quelle
+1 für das Heraushalten aus der Registrierung. Ich kann es jetzt nicht finden, aber ich erinnere mich an die Lektüre, dass jemand bei MS zugegeben hatte, dass die Registrierung ein Fehler war.
Chinmay Kanchi
1
Stimmen Sie mit Ausnahme des XML-Teils mit Ihnen überein. Ich würde ini (oder einfache Textdatei) für einfache Einstellungsanforderungen und SQLite für komplexe Apps verwenden.
Codism
Sie geben das gerade zu? Das hätte ich dir schon 1995 sagen können! Mac OS Classic hat es richtig gemacht: Ein Einstellungsordner, in dem Sie Konfigurationsinformationen zentral speichern können, wobei jede App in einer eigenen Datei gespeichert wird. Als ich die Registrierung zum ersten Mal sah, sagte ich: "Hat Microsoft noch nie davon gehört, nicht alle Eier in einen Korb zu legen?!?"
Mason Wheeler
1
Ich denke, es ist in Ordnung, OS-Einstellungen (wie die Registrierung von Dateierweiterungen usw.) vorzunehmen. Aber wenn Microsoft es als schreibgeschützte API veröffentlicht hätte, wären sie wahrscheinlich darüber verklagt worden und hätten es sowieso beschreibbar machen müssen.
µBio
@Chinmay, @Mason, die Registrierung ist kein Fehler, da die Registrierung weit mehr als nur Konfigurationsdaten speichert (siehe: Gruppenrichtlinien, Domänen, Replikation). Der Fehler ist, wie Microsoft Entwickler darauf aufmerksam gemacht hat und dass es keinen guten Standard für die Verwendung gibt. Es endete als Müllhalde für App-Daten, wofür es nie gedacht war.
Matt Olenik
3

Meine Antwort ist eine Kombination aus Chinmay Kanchis Antwort und BioBuckyBalls Antwort .

XML / Json für einfache Konfigurationen, SQLite für komplexe, größere Konfigurationen, die im Standardordner für Betriebssystemanwendungen oder im Standardordner für Betriebssystembenutzer abgelegt sind, wenn Konfigurationen benutzerabhängig sind. Beides könnte genutzt werden.

Maniero
quelle
2

Unter Windows würde ich die Anwendungseinstellung im AppDataOrdner behalten

Graviton
quelle
1

Benutzereinstellungen sind normalerweise in

/home/<user>/.<application> 

So zum Beispiel für irssi-Einstellungen sind /home//.irssi/config

Chris
quelle
Dies ist jedoch eine Unix-Konvention. Was ist mit Windows? Und überschwemmt man unter Linux das Home-Verzeichnis des Benutzers nicht mit Unterverzeichnissen? Warum nicht /home/<user>/etc/application?
Wizard79
@Lorenzo: Das Überfluten des Benutzerverzeichnisses ist selten ein Problem.
Chinmay Kanchi
1
Konfigurationseinstellungen werden zunehmend verschoben ~/.config/application, um die Konsolidierung zu unterstützen. Ich bin geneigt, dieser Bewegung zuzustimmen.
Greyfade
1
@Lorenzo: Dies entspricht genau der Windows-Konvention zum Speichern von Konfigurationsdateien in AppData.
Greyfade
1
@ Chris: auf keinen Fall! :-)
Wizard79
1

Ich denke, es ist am besten, den bevorzugten plattformspezifischen Mechanismus zu verwenden. Unter OS X besteht der bevorzugte Mechanismus darin, eine Eigenschaftsliste in ~ / Library / Preferences abzulegen, und die Cocoa-API verfügt über eine sehr einfache Oberfläche zum Speichern und Abrufen von Einstellungen.

Wenn Ihre App plattformübergreifend ist, können Sie dies mit einer Klasse oder so weiter abstrahieren.

mipadi
quelle
0

Das einzige, was ich in die Registrierung schreibe, ist der Speicherort der App, sodass Installer und Updater sie leicht finden können. Alles andere wird in Dateien in / AppData / Company / App gespeichert

GroßmeisterB
quelle
-2

Für Java-Apps halte ich gson für eine gute Wahl. Erstellen Sie Ihre Einstellungsobjekte und konvertieren Sie sie mit gson in JSON und umgekehrt. Es hat den Vorteil, dass es von Menschen lesbar ist, anstatt von seriellen Blobs.

Edit: ok, also ist es vielleicht nicht so allgemein ...

FeatureCreep
quelle
-2

Wenn Sie in .NET schreiben, können Sie mithilfe von System.Environment.SpecialFolders herausfinden, welche Ordner zum Speichern der Konfiguration oder einiger Daten verwendet werden können.

James
quelle