Cara terbaik untuk menyimpan pengaturan aplikasi

17

Di Windows cara standarnya adalah registri. Ini memungkinkan Anda untuk membedakan pengaturan sistem dan per pengguna.

Di Unix Anda harus menggunakan file teks di folder / etc untuk pengaturan seluruh sistem (apa konvensi untuk pengaturan per-pengguna?).

Banyak program baru (dan terutama yang dirancang untuk portable) menggunakan file XML.

  • Apa cara terbaik (dan lokasi) untuk menyimpan pengaturan non-BLOB?
  • Haruskah kita mengikuti setiap sistem default atau memiliki solusi terpadu?
  • Dan apa cara portabel terbaik ?
Wizard79
sumber
Harap sangat spesifik tentang apa yang Anda maksud dengan "terbaik".
3
@ Thorbjørn: adj terbaik \ ˈbest \ superlatif baik
Wizard79
3
Anda akan kagum pada keragaman makna "terbaik" di situs StackExchange.

Jawaban:

23

Apa cara terbaik (dan lokasi) untuk menyimpan pengaturan non-BLOB?

Pada Windows, tampaknya dapat diterima untuk menggunakan registri. Menurut pendapat saya, registri adalah sistem yang dirancang dengan buruk, dan sebagai gantinya file teks sederhana dalam Users\Username\AppDatadirektori harus lebih disukai. Ini lebih mudah untuk dicadangkan, lebih sedikit berbahaya bagi pengguna untuk dimodifikasi, dan lebih mudah untuk dibersihkan.

Di Linux dan sebagian besar Unix, Lokasi yang dipilih adalah /home/user/.config/appnameuntuk pengaturan spesifik pengguna dan /etc/untuk pengaturan global (seluruh sistem). Lokasi yang kurang disukai (tetapi dapat diterima) untuk pengaturan pengguna adalah ~/.appname, tetapi ini umumnya tidak disukai. File-file ini harus dapat diedit pengguna, jadi format yang dapat dibaca manusia selalu lebih disukai.

Saya tidak setuju dengan kebanyakan orang bahwa XML adalah format yang dapat diterima untuk menyimpan data non-gumpalan. Menurut saya, ini adalah format yang terlalu rumit dan terlalu rumit untuk apa yang biasanya hanya berupa data terstruktur yang sangat kecil. Saya lebih suka melihat file dalam YAML, JSON, ASN.1, name = pasangan nilai, atau format serupa. Memiliki terlalu banyak sintaks membuatnya terlalu mudah bagi pengguna untuk mengacaukan dan meninggalkan file dalam format yang tidak valid.

Haruskah kita mengikuti setiap sistem default atau memiliki solusi terpadu?

Itu sepenuhnya terserah Anda, tetapi ingatlah beberapa hal:

  • Platform seperti * nix memiliki batasan ketat di mana lokasi dapat ditulis. Lebih ketat dari Windows. Begitu:
    • Satu-satunya tempat Anda harus menulis apa pun adalah di direktori home pengguna.
    • Kecuali jika aplikasi Anda adalah layanan sistem; dalam hal ini, semua file data yang dapat diubah harus ditulis /var/. File data yang tidak dapat diubah harus disimpan di direktori aplikasi Anda di /usr/share/atau /usr/local/share/atau/opt/
    • File konfigurasi di /etc/harus tidak pernah ditulis oleh aplikasi ketika sedang berjalan, bahkan jika memiliki akses tulis kepada mereka. /etc/harus menjadi repositori untuk perilaku default dan tidak ada yang lain.
    • Rencana untuk aplikasi Anda akan dipasang di salah satu dari tiga tempat: /usr/local/, /opt/appname, atau /home/username/appname.
    • Gumpalan harus disimpan di samping file konfigurasi lain jika ingin diubah. Hal ini umumnya lebih untuk menggunakan format yang dapat diedit-pengguna, jadi sesuatu seperti SQLite atau Berkeley DB lebih disukai (karena ada alat baris perintah untuk masing-masing), tetapi tidak diperlukan.
  • Di Windows, aplikasi Anda seharusnya hanya menulis di direktori Pengguna. Lokasi standar untuk file data adalah Users\User\AppData. Tidak ada tempat lain yang bisa diterima.
  • Pada Mac OS X, pengaturan aplikasi Anda harus disimpan ~/Library/Preferencesbersama dengan semua file plist aplikasi lain. plisttampaknya merupakan format yang disukai, tetapi Anda ingin memeriksa ulang dengan pedoman Apple.

Dan apa cara portabel terbaik?

Tidak ada yang "terbaik", jujur ​​saja. Hanya ada batasan dan harapan spesifik platform. Rekomendasi saya adalah tetap menggunakan sarana khusus platform, bahkan jika itu berarti menulis lebih banyak kode.

greyfade
sumber
1
Saya pikir Microsoft telah mengecilkan penggunaan registri selama beberapa tahun sekarang - yang bagus. Menulis ke AppData, seperti yang Anda sebutkan, adalah caranya. Dalam. NET (mungkin juga di Windows API?) Bahkan ada metode yang mengembalikan jalur yang benar.
MetalMikester
Ada juga variabel lingkungan:%APPDATA%
greyfade
@MetalMikester - ya, sangat tepat. AppData didukung oleh Profil Roaming untuk lingkungan domain juga.
JBRWilkinson
pengaturan! = 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 - Pengembang Windows API lama, Raymond Chen, membahas ini, dan menjelaskan mengapa menggunakan file teks pada registri bukanlah pola desain yang lebih baik: Mengapa file INI tidak digunakan lagi karena registri
Mick
8

Di bawah Windows, gunakan %APPDATA%\appname. Di bawah * NIX, gunakan ~/.appname. Jangan menggunakan nama direktori tetap di bawah platform mana pun, karena direktori home pengguna dapat berbeda dari default (misalnya di jaringan, misalnya).

Adapun format, gunakan apa pun yang menurut Anda terbaik. Itu adalah keputusan yang hanya dapat Anda buat dalam konteks aplikasi Anda. Tidak perlu, dan memang, tidak disarankan, untuk memiliki cara "standar" untuk melakukannya, jika cara "standar" itu bukan yang terbaik untuk program khusus Anda.

Misalnya, XML / JSON mungkin merupakan cara yang baik untuk menyimpan data / konfigurasi pengguna jika aplikasi Anda sudah menggunakan XML / JSON untuk hal lain. Tetapi jika itu adalah file konfigurasi yang sederhana, mengapa menambahkan mengasapi ke aplikasi Anda dengan memperkenalkan ketergantungan? Dalam hal ini, mungkin lebih baik menggunakan file teks sederhana dengan var: value\nbaris saja.

EDIT: Tidak ada cara portabel "terbaik", karena OS menggunakan konvensi yang sangat berbeda untuk ini. Jangan melanggar standar OS tanpa alasan yang jelas.

EDIT2: Jika Anda menemukan diri Anda membuat pengaturan seluruh sistem dalam /etcatau HKEY_LOCAL_MACHINE, tanyakan pada diri sendiri apakah pengaturan tersebut benar - benar global. Kemudian tunggu 5 menit dan tanyakan pada diri Anda lagi. Jika jawabannya masih ya, maka tentu saja, buatlah pengaturan global. Ingat, pengguna normal tidak memiliki akses tulis ke /etcatau HKEY_LOCAL_MACHINEdan dengan melakukan ini, Anda memastikan bahwa seseorang tanpa hak admin tidak dapat menginstal aplikasi Anda.

Chinmay Kanchi
sumber
Paragraf pertama memungkinkan seseorang untuk menggunakan Path.Combine atau yang serupa dan dengan demikian mengatur lokasi root relatif menjadi% APPDATA% atau ~ dan membiarkan kode melakukan sisanya, untuk EDIT2 memang tidak ada solusi lintas-platform yang saya tahu dari. Mungkin ada orang yang telah menulis pustaka konfigurasi lintas-platform untuk tujuan itu, setidaknya itu ide yang bagus ...
Tamara Wijsman
1
@ TomWij: Tentunya setiap pengembang yang kompeten harus dapat mengetahui bahwa Anda tidak perlu menggunakan literal di mana-mana;). Untuk itulah variabel digunakan.
Chinmay Kanchi
1
~/.config/applicatonsemakin menjadi lokasi pilihan di * nix.
greyfade
@ Greyfade: Saya tidak pernah benar-benar menyadari hal ini, tetapi Anda benar. Di komputer saya, sekitar seperempat aplikasi yang menyimpan data konfigurasi ~melakukannya ~/.config/appname.
Chinmay Kanchi
Sejumlah besar aplikasi menggunakan ~ / .appname di Windows (yang setara dengan dir profil pengguna Anda, BUKAN dokumen) dan itu sangat mengganggu. Folder itu tidak menyembunyikan diri!
Alan Pearce
3

Aku mencoba dan menjaga dari registri, itu cara yang lebih digunakan. Saya berharap semua orang mau.

Saya suka menyimpan file konfigurasi xml atau file bin atau kadang-kadang database lokal (SQLite).

μBio
sumber
+1 untuk mencegah keluar dari registri. Saya tidak dapat menemukannya sekarang, tetapi sepertinya saya ingat pernah membaca bahwa seseorang di MS telah mengakui bahwa registri adalah kesalahan.
Chinmay Kanchi
1
Setuju dengan Anda kecuali bagian XML. Saya akan menggunakan ini (atau file teks sederhana) untuk persyaratan pengaturan sederhana dan SQLite untuk aplikasi yang kompleks.
Codism
Mereka baru saja mengakui itu? Saya bisa katakan itu pada tahun 1995! Mac OS Classic sudah benar: Folder Preferensi memberi Anda tempat terpusat untuk menyimpan informasi konfigurasi, dengan setiap aplikasi menyimpan ke file sendiri. Ketika saya pertama kali melihat Registry, saya seperti, "Apakah Microsoft tidak pernah mendengar tidak meletakkan semua telur Anda dalam satu keranjang?!?"
Mason Wheeler
1
Saya pikir sebagai tempat untuk meletakkan pengaturan OS (seperti pendaftaran ekstensi file, dll), tidak apa-apa. Tetapi jika Microsoft menerbitkannya sebagai api hanya-baca, mereka mungkin akan dituntut dan harus membuatnya dapat ditulis.
μBio
@Chinmay, @Mason, registri BUKAN kesalahan karena registri melakukan JAUH lebih dari sekadar menyimpan data konfigurasi (lihat: kebijakan grup, domain, replikasi). Kesalahannya adalah bagaimana Microsoft mengirimkannya ke pengembang, dan kurangnya standar yang baik tentang cara menggunakannya. Itu berakhir sebagai tempat pembuangan untuk data aplikasi, yang bukan untuk apa.
Matt Olenik
3

Jawaban saya adalah kombinasi dari Chinmay Kanchi ini jawaban dan BioBuckyBall ini jawabannya .

XML / Json untuk konfigurasi sederhana, SQLite untuk konfigurasi kompleks, lebih besar diparkir di folder aplikasi OS default atau folder pengguna OS default ketika konfigurasi bergantung pada pengguna. Keduanya bisa digunakan.

Maniero
sumber
2

Di Windows, saya akan menyimpan pengaturan aplikasi di AppDatafolder

Graviton
sumber
1

Pengaturan pengguna biasanya dalam

/home/<user>/.<application> 

Jadi misalnya untuk pengaturan irssi adalah /home//.irssi/config

Chris
sumber
Tapi ini adalah konvensi Unix. Bagaimana dengan Windows? Dan di Linux, bukankah membanjiri direktori home user dengan subdirektori? Mengapa tidak /home/<user>/etc/application?
Wizard79
@ Lorenzo: Membanjiri direktori home pengguna jarang menjadi masalah.
Chinmay Kanchi
1
Pengaturan konfigurasi semakin banyak dipindahkan ~/.config/applicationuntuk membantu menjaga hal-hal terkonsolidasi. Saya cenderung setuju dengan gerakan ini.
greyfade
1
@ Lorenzo: Ini persis sama dengan konvensi Windows untuk menyimpan file konfigurasi AppData.
greyfade
1
@ Chris: tidak mungkin! :-)
Wizard79
1

Saya pikir yang terbaik adalah menggunakan mekanisme spesifik platform yang disukai. Sebagai contoh, pada OS X, mekanisme yang disukai adalah menempatkan daftar properti di ~ / Library / Preferences, dan Cocoa API memiliki antarmuka yang sangat sederhana untuk menyimpan dan mengambil pengaturan dari sana.

Jika aplikasi Anda adalah lintas-platform, Anda bisa mengabstraksi ini dengan kelas atau yang lainnya.

mipadi
sumber
0

Satu-satunya hal yang saya tulis ke registri adalah lokasi aplikasi, sehingga installer dan updaters dapat menemukannya dengan mudah. Segala sesuatu yang lain disimpan dalam file di / AppData / Company / App

GrandmasterB
sumber
-2

Untuk aplikasi Java, saya pikir gson adalah pilihan yang baik. Buat objek pengaturan Anda dan gunakan gson untuk mengubahnya menjadi JSON dan sebaliknya. Memiliki keuntungan menjadi manusia yang dapat dibaca, bukan gumpalan serial.

Sunting: ok, jadi mungkin tidak terlalu umum ...

FeatureCreep
sumber
-2

Jika Anda menulis di .NET, Anda dapat menggunakan System.Environment.SpecialFolders untuk mengetahui lokasi folder apa yang dapat Anda gunakan untuk menyimpan konfigurasi atau bahkan beberapa data.

James
sumber