Hallo,
Du denkst zu sehr Windows. Unter Unix nennt man das nicht $APPDATA, sondern $HOME und Anwendungen speichern alles dorthin. Wo genau hängt vom Programm und vom verwendeten Toolkit ab.
Jap, ich finde diese Konzept des appdata Ordners gut. Ich möchte nicht dass das Programm entscheidet wo es seine Daten hinspeichert, sondern dass das Teil des Konzeptes ist.
Naja, Programme dürfen an sich erstmal nur nach $HOME speichern, das heißt, dass dein Appdata dort auch liegt. Wenn du ein vernünftiges Konzept anbietest, werden Programme das auch nutzen - du kannst sie aber nicht dazu zwingen, ihre Daten dort abzulegen. Du könntest einfach $HOME/AppData/anwendungsname/ als "best practice" festlegen, oder - was unter Unix praktiziert wird - $HOME/.anwendungsname. Inzwischen gibt es da viel zu viel Wildwuchs (~/.local, ~/.config, ~/.dbus, ~/.gconf, ~/.gconfd, ...), von daher ist eine feste Schnittstelle zu begrüßen.
Damit dürfte auch das Umziehen auf eine neue Platte und sowas viel einfacher werden. Was ich halt bräuchte wäre, dass mir jemand eindeutige Nachteile nennen kann, für die mir keine Lösung einfällt oder für die es zu Umständlich damit wird.
Bitte keine Registrierung. Jedes Programm soll nach Möglichkeit in dem Format abspeichern dürfen, was ihm am besten gefällt und nicht auf "key=value" oder XML-Datensätze beschränkt sein. Ansonsten ziehst du ein Linux-System um, indem du $HOME auf die neue Festplatte kopierst.
Naja, ich würde bestimmte Standard-Ordner schon definieren wollen. Damit will ich erreichen das Programme (z.B. nen Office-Programm) einen Einsprungpunkt in das Dateisystem haben, wo wahrscheinlich die meisten ihre Sachen speichern werden.
Ja, ist sinnvoll. Aber wenn ich die Ordner lösche, dann möchte ich auch, dass die weg sind und nicht bei jedem Login neu erzeugt werden.
Ansonsten sollte jedes Programm immer die vom System bereitgestellte Lib benutzen, da dort z.B. Sicherheitsfixes integriert wurden oder so.
Davon kannst du ausgehen wenn du ein Repository hast, aber nicht bei nem Hobby OS oder z.B. Windows. Also muss ich das irgendwie anders lösen.
Wieso? Wenn du ein Programm auf dein OS portierst, dann musst du ohnehin die benutzten Libs portieren. Die kannst du dann aber auch gleich systemweit installieren und von anderen Programmen mitbenutzen lassen. Jedem Programm seine eigene libSDL zu geben ist jedenfalls Mist.
Die Datei selbst heißt /usr/lib/libSDL-1.2.so.0.11.3 (bzw. /lib/libc-2.11.2.so), hat also im Dateinamen ihre Version; diese Lib kann ein Programm benutzen, wenn es exakt diese Version braucht. Außerdem gibt es noch verschiedene Symlinks darauf (/usr/lib/libSDL.so und /usr/lib/libSDL-1.2.so.0 bzw. /lib/libc.so.6).
Das ist ja auch erstmal alles gut und schön, aber das führt doch dazu das man irgendwann so ziemlich alle Versionen auf dem System hat die es von jeder Library gibt.
Nö. Es gibt ja für die meisten Programme keine Notwendigkeit, zwingend eine bestimmte Bibliotheksversion zu benutzen - die Nachfolgeversionen sind fast immer kompatibel.
Das ist halt unschön und das muss man irgendwie managen. Unter Linux macht das nen Paketmanager, sowas habe ich noch nicht geplant.
Also möchtest du doch das Windows-Konzept der Setup-Programme (pro Anwendung) weiterführen. Das finde ich kaputt; stabil lässt sich das nämlich nur machen, wenn alle Programme ihre Bibliotheken ins Anwendungsverzeichnis (Bundle) stopfen und damit von Updates ausgeschlossen sind - siehe MacOS. Alles andere wird über kurz oder lang dein Systemverzeichnis zerschießen, weil Setupprogramme historisch gesehen immer der letzte Dreck sind.
Der Windows-Installer hat eher was mit Paketverwaltung von Linux zu tun als mit dem InstallShield, der bei Anwendungen früher dabei war. So schlecht kann das Konzept also nicht sein.
Auch würde ich einfach vorschreiben, das wenn sich das Interface (ABI) nicht geändert hat, immer die neuste Version genommen wird. Des Weiteren würde ich weder libSDL.so haben wollen, noch das ein Programm die genaue Version anfordern kann, also z.B. libSDL-1.2.so.0.11.3.
Darum verweist die /lib/libc.so.6 immer auf die aktuelle Version der C-Bibliothek mit der ABI-Version 6. Wenn der Loader erstmal ein "ls" auf den Lib-Ordner machen muss, um die aktuelle Version rauszufinden, dann ist das umständlich und kaputt.
Damit kann ich erstens vermeiden, das es Probleme gibt mit dem Interface und zweitens das ich zuviele Versionen ein und derselben Library habe.
Wenn die neue Version der Lib funktioniert und du den Symlink /lib/libc.so.6 -> /lib/libc-2.11.2.so korrekt gesetzt hast, kannst du die alte Version einfach löschen. Fertig.
Jetzt komm ich dann auch zum Managen der Libraries. Ich würde den Programmordner von einer Art Library-Manager beobachten lassen und jedes Mal wenn ein Programm installiert wird, wird in eine Art Datenbank (oder sowas) die mitgebrachten/benötigten Libraries eingetragen und wenn ein Programm gelöscht/Deinstalliert wird, wird in der Datenbank nachgeguckt, ob es noch andere Programme gibt, die irgendeine Library die das zu deinstallierende Programm braucht, auch brauchen. Ansonsten können diese gelöscht werden.
Das ist kaputt.
Stell dir mal vor, ein Programm baut jetzt ganz viele Dateien, die alle aussehen wie Libraries, aber keine sind (sondern z.B. Texturen). Dann fängt dein Library-Manager an, in die Datenbank tausende von Texturen einzutragen, die da garnicht hingehören. Außerdem zerfällt dein Gesamtsystem zu staub, wenn die Datenbank mal kaputt geht.
Das ist das Konzept der Windows-Registrierdatenbank. Ich mag es nicht. Wenn du es willst - deine Sache.
Ich würde dann wahrscheinlich sogar soweit gehen, das man den Pfad wo nach den Libraries gesucht wird, nicht ändern kann, sondern der ist fest vorgegeben.
Würde ich nicht tun. Verschenkt unglaubliche Flexibilität.
Alle ausführbaren Dateien an einen Ort zu packen hat einen Vorteil, nämlich dass man mit $PATH arbeiten kann, du also bei Verknüpfungen und so keine vollen Pfadangaben machen brauchst.[...]
Deswegen will ich ja so einen "Programme" Ordner, damit alle Programme an einem Ort sind, aber nicht so dass auch alle Dateien in einem Ordnern sind. Das kann man mit Kommandozeilentools machen aber nicht mit Grafikprogrammen.
Du kannst $PATH aber schlecht sagen "und alle Unterordner auch bitte". Das wird beim Suchen zu langsam. Entweder du tust alle Binaries in einen gemeinsamen Ordner oder du tust jedes Binary in den Anwendungsordner. Im letzten Fall musst du an jeder Stelle den vollen Pfad angeben (oder jedes einzelne Programm zu $PATH explizit hinzufügen, was wieder andere Probleme nach sich zieht).
Und ja ich möchte diesen shared Ordner haben, das soll alles unter dem /home Verzeichnis sein, weil es für mich einfach nur ein User ist, nur halt einer auf den alle Zugriff haben.
Du trennst also zwischen "können alle nutzen, gehört zum System", "können alle nutzen, gehört nicht zum System" und "kann nur einer nutzen, gehört ihm". Naja, musst du wissen. Ich finde das nicht besonders gut.
Insbesondere gehören ausschließlich Nutzerdaten nach /home, sonst nichts. "shared" ist kein Nutzer, sondern eine Nutzergruppe.
Wenn du einen Sinn für Setup-Programme siehst, ist dein Konzept kaputt.
Dann müsste der Unix-Weg ja auch kaputt sein und der MacOS-Weg ist dann viel zu uneffektiv. Denn ich denke da an die Libraries, unter Unix hast du das Problem der Dependencies (und dafür hast du nen Paketmanager, für mich nichts anderes als nen Setup-Programm) und unter MacOS (wenn ich es richtig verstanden habe) bringt jedes Programm seine eigene Libraries mit und man hätte so keine Vorteile wenn man eine Library mal updatet, sondern das müsste man für alle Libraries in jedem Programm Ordner machen und dann kann man nicht mal davon ausgehen, das die alle gleich benannt sind. Das würde ich kaputt nennen!
Paketverwaltung != Setup-Programm. Erstere ist nämlich auch für das Auflösen von Abhängigkeiten, Updates und so zuständig und außerdem in der Lage, die Integrität des Systems sicherzustellen. Ein Setup-Programm kopiert nur die benötigten Daten an einen Ort und kümmert sich nicht weiter um das System. Anders ausgedrückt: Die Paketverwaltung ist Teil des Betriebssystems, das Setup-Programm ist Teil der Anwendung.
Der MacOS-Weg ist wirklich so, dass jedes Programm alle Libs mitbringt, die das Basisbetriebssystem nicht hat. Nur so kannst du vollständig unabhängige Programmbundles haben, die immer und überall funktionieren (endnutzerfreundlich).
Sprich man würde nen Art Paketmanager haben, der halt auch nen Überblick über die Libraries hat (ich weiß, ich nerve mit den Libraries, aber die sind nunmal nicht so einfach zu handeln). Man würde also das Konzept von MacOS (jedes Programm in einem Ordner mit bestimmten Vorgaben) mit den oben genannten Dingen verbinden.
Das kann man nicht verbinden: Entweder, du hast alles, was zu einem Programm gehört in einem Ordner (dem Bundle), oder du installierst die Bestandteile des Programms (Libs, Binaries, Doku, ...) in verschiedene Ordner im System. Eine Mischung davon gibt es nicht. Das ist dann auch kein Bundle mehr, sondern ein Paket, welches installiert werden muss.
Eine zentrale Datenbank, die in die innere Struktur der Anwendungen reinpfuscht ist jedenfalls nicht besonders hilfreich. Was machst du denn bei Library-Updates? Einfach in jedem Programm die Lib ersetzen?
Da könnte ich dann sogar einfach .tar.foo (wobei foo irgendein Komprimierverfahren wäre) als Paketformat nehmen und da ist ne vorgegebene Ordnerstruktur drin. Damit muss man nichts neues erfinden.
Du könntest in dem Moment auch gleich DEB oder RPM benutzen... und hättest schlagartig ein Paketmanagementsystem als Lösung für dein Problem gefunden.
Gruß,
Svenska