Uygulama ayarlarını kaydetmenin en iyi yolu


17

Windows'ta varsayılan yol kayıt defteri. Bu, sistem genelindeki ve kullanıcı başına ayarları ayırt etmenizi sağlar.

Unix'te sistem genelinde ayarlar için / etc klasöründeki metin dosyalarını kullanmalısınız (kullanıcı başına ayarlar için kural nedir?).

Birçok yeni program (ve özellikle taşınabilir olmak için tasarlananlar) XML dosyaları kullanır.

  • BLOB dışı ayarları depolamanın en iyi yolu (ve konumu) nedir?
  • Her bir sistem varsayılanını izlemeli miyiz yoksa birleşik bir çözümümüz olmalı mı?
  • Ve en iyi taşınabilir yol nedir?

Lütfen "en iyi" ile ne demek istediğiniz konusunda çok net olun

3
@ Thorbjørn: en iyi adj \ ˈbest \ üstünlük üstün
Wizard79

3
StackExchange sitelerinde "en iyi" anlam çeşitliliğinden şaşıracaksınız.

Yanıtlar:


23

BLOB dışı ayarları depolamanın en iyi yolu (ve konumu) nedir?

Windows'da kayıt defterini kullanmak kabul edilebilir görünüyor. Bence, kayıt defteri kötü tasarlanmış bir sistemdi ve bunun yerine Users\Username\AppDatadizindeki basit bir metin dosyası tercih edilmelidir. Bu, yedeklenmesi daha kolay, kullanıcılar için daha az tehlikeli ve temizlenmesi daha kolaydır.

Linux'ta ve çoğu Unix'te, Tercih edilen konum /home/user/.config/appnamekullanıcıya özgü ayarlar ve /etc/genel (sistem çapında) ayarlar içindir. Kullanıcı ayarları için daha az tercih edilen (ancak kabul edilebilir) konum ~/.appname, ancak bu genellikle gözden düşüyor. Bu dosyalar kullanıcı tarafından düzenlenebilir olmalıdır, bu nedenle her zaman okunabilir bir format tercih edilir.

Çoğu insanla XML'in blob olmayan verileri depolamak için kabul edilebilir bir format olduğunu kabul etmiyorum. Benim görüşüme göre, genellikle çok küçük bir yapısal veri parçası haline gelen şey için aşırı işlenmiş ve aşırı karmaşık bir biçimdir. Dosyaları YAML, JSON, ASN.1, name = değer çiftleri veya benzeri biçimlerde görmeyi tercih ederim. Çok fazla sözdizimine sahip olmak, kullanıcının dosyayı karıştırıp geçersiz bir biçimde bırakmasını çok kolaylaştırır.

Her bir sistem varsayılanını izlemeli miyiz yoksa birleşik bir çözümümüz olmalı mı?

Bu tamamen size bağlı, ancak bazı şeyleri aklınızda bulundurun:

  • * Nix gibi platformlar, yazılabilir konumların kesin sınırlamalarına sahiptir. Windows'tan daha katı. Yani:
    • Herhangi bir şeye yazmanız gereken tek yer kullanıcının ana dizinindedir.
    • Başvurunuz bir sistem hizmeti olmadığı sürece ; bu durumda, değiştirilebilir tüm veri dosyaları yazılmalıdır /var/. Değiştirilemeyen veri dosyaları uygulama dizininizde /usr/share/veya /usr/local/share/veya/opt/
    • Yapılandırma dosyaları /etc/gerektiğini asla uygulama tarafından yazılabilir bunun onlara yazma erişimi olsa bile, çalışırken. varsayılan davranışların /etc/deposu olmalı ve başka bir şey olmamalıdır .
    • Uygulamanız için Planı üç yerden birinde kurulacak: /usr/local/, /opt/appnameveya /home/username/appname.
    • Bloblar değiştirileceklerse diğer yapılandırma dosyalarının yanında saklanmalıdır. Genellikle kullanıcı tarafından düzenlenebilir bir biçimin kullanılması tercih edilir, bu nedenle SQLite veya Berkeley DB gibi bir şey tercih edilir (çünkü her biri için komut satırı araçları vardır), ancak gerekli değildir .
  • Windows'ta uygulamalarınız yalnızca Kullanıcı dizinine yazmalıdır. Veri dosyaları için standart konum Users\User\AppData. Başka hiçbir yerde kabul edilebilir görünmüyor.
  • Mac OS X'te, uygulama ayarlarınız ~/Library/Preferencesdiğer tüm uygulamaların plist dosyalarıyla birlikte saklanmalıdır . plisttercih edilen biçim gibi görünüyor, ancak Apple yönergelerini tekrar kontrol etmek isteyeceksiniz.

Ve en iyi taşınabilir yol nedir?

Dürüst olmak gerekirse "en iyi" yoktur. Yalnızca platforma özgü sınırlamalar ve beklentiler vardır. Benim tavsiyem, daha fazla kod yazmak olsa bile platforma özgü araçlara bağlı kalmaktır.


1
Microsoft'un birkaç yıldır kayıt defterinin kullanımını cesaretlendirdiğini düşünüyorum - bu iyi. Bahsettiğiniz gibi, AppData'ya yazmanın yolu budur. .NET'te (belki Windows API'sında da olabilir mi?) Doğru yolu döndüren bir yöntem bile vardır.
MetalMikester

Bir ortam değişkeni de var:%APPDATA%
greyfade

@MetalMikester - evet, kesinlikle yerinde. AppData, bir etki alanı ortamı için Dolaşım Profili tarafından da desteklenir.
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 - Uzun zamandır Windows API geliştiricisi Raymond Chen, bunu ele alıyor ve kayıt defterinde metin dosyalarının kullanılmasının neden daha iyi bir tasarım deseni olmadığını açıklıyor: INI dosyaları neden kayıt defteri lehine kullanımdan kaldırılıyor
Mick

8

Windows altında kullanın %APPDATA%\appname. * NIX altında, öğesini kullanın ~/.appname. Kullanıcının giriş dizini varsayılandan farklı olabileceğinden (örneğin ağda olabilir), her iki platformun altında sabit dizin adları kullanmayın.

Biçime gelince, en iyi olduğunu düşündüğünüz her şeyi kullanın. Bu, başvurunuz bağlamında yalnızca sizin verebileceğiniz bir karardır . Eğer bu "standart" yol sizin programınız için en iyisi değilse, bunu yapmanın "standart" bir yolunun olması gereksizdir ve gerçekten de kaçınılmazdır.

Örneğin, uygulamanız başka bir şey için zaten XML / JSON kullanıyorsa, XML / JSON kullanıcı verilerini / yapılandırmasını depolamanın iyi bir yolu olabilir. Ancak bu basit bir yapılandırma dosyasıysa, neden bir bağımlılık getirerek uygulamanıza şişkinlik eklemelisiniz? Bu durumda, bunun var: value\nyerine satırları olan basit bir metin dosyası kullanmak en iyisidir .

DÜZENLEME: İşletim sistemleri bunun için çok farklı kurallar kullandığından "en iyi" taşınabilir yol yoktur. Kanlı bir sebep olmadan işletim sistemi standartlarını ihlal etmeyin.

EDIT2:/etc veya sistem genelinde sistem genelinde bir ayar HKEY_LOCAL_MACHINEyapıyorsanız, ayarın gerçekten küresel olup olmadığını kendinize sorun . Sonra 5 dakika bekleyin ve tekrar kendinize sorun. Cevap hala evetse, elbette, küresel bir ayar yapın. Unutmayın, normal bir kullanıcının yazma erişimi yoktur /etcveya HKEY_LOCAL_MACHINEbunu yaparak yönetici hakları olmayan birisinin uygulamanızı yükleyemediğinden emin olursunuz.


İlk paragraf bir Path.Combine veya benzer bir şey kullanmanıza izin verir ve böylece göreli kök konumunu bir kez% APPDATA% veya ~ olarak ayarlar ve kodun geri kalanını yapmasına izin verir, EDIT2 için gerçekten biliyorum çapraz platform çözümü yok nın-nin. Belki de bu amaçla bir platformlar arası yapılandırma kütüphanesi yazan insanlar var, en azından iyi bir fikir olurdu ...
Tamara Wijsman

1
@TomWij: Kesinlikle herhangi bir yetkili geliştirici, her yerde değişmezleri kullanmanız gerekmediğini anlayabilmelidir;). Değişkenler bunun içindir.
Chinmay Kanchi

1
~/.config/applicaton* nix'te giderek daha çok tercih edilen yer haline geliyor.
greyfade

@greyfade: Bunu hiç fark etmedim, ama haklısın. Makinemde, yapılandırma verilerini depolayan uygulamaların yaklaşık dörtte biri ~bunu yapıyor ~/.config/appname.
Chinmay Kanchi

Bir sürü uygulama Windows'ta ~ / .appname kullanır (bu, kullanıcı profili dizininize eşittir, belgeler DEĞİLDİR) ve çok sinir bozucu. Bu klasörler kendilerini gizlemiyor!
Alan Pearce

3

Ben denemek ve kayıt defteri dışında tutmak, yol bitti kullanılan. Keşke herkes yapsın.

Ben xml yapılandırma dosyaları veya bir bin dosyası veya bazen yerel bir veritabanı (SQLite) tutmak gibi.


Kayıt defterinin dışında tutmak için +1. Şimdi bulamıyorum, ancak MS'de birisinin kayıt defterinin bir hata olduğunu kabul ettiğini okuduğumu hatırlıyorum.
Chinmay Kanchi

1
XML kısmı dışında sizinle aynı fikirde. Basit ayar gereksinimi için ini (veya basit metin dosyası) ve karmaşık uygulamalar için SQLite kullanırdım.
Codism

Şimdi bunu kabul ediyorlar mı? 1995 yılında bunu size söyleyebilirim! Mac OS Classic bunu doğru yaptı: Yapılandırma bilgilerini depolamak için merkezi bir yer sağlayan bir Tercihler klasörü ve her uygulama kendi dosyasına kaydedilir. Kayıt defterini ilk gördüğümde, "Microsoft tüm yumurtalarınızı bir sepete koymadığınızı hiç duymamış mıydı?"
Mason Wheeler

1
İşletim sistemi ayarlarını koymak için bir yer olarak düşünüyorum (dosya uzantısı kaydı vb.), Sorun değil. Ancak Microsoft bunu salt okunur bir API olarak yayınlasaydı, muhtemelen dava açılmış ve yine de yazılabilir hale getirmek zorunda kalacaklardı.
µBio

@Chinmay, @Mason, kayıt defteri bir hata değildir çünkü kayıt defteri sadece yapılandırma verilerini depolamaktan daha fazlasını yapar (bkz: grup politikası, etki alanları, çoğaltma). Hata, Microsoft'un geliştiricilere nasıl adım attığı ve nasıl kullanılacağı konusunda iyi bir standardın bulunmamasıdır. Uygulama verileri için dampingli bir zemin olarak sona erdi, bu hiç de amaçlanmadı.
Matt Olenik

3

Cevabım Chinmay Kanchi'nin yanıtı ve BioBuckyBall'ın yanıtı .

Basit yapılandırmalar için XML / Json, varsayılan işletim sistemi uygulama klasörüne veya yapılandırmalar kullanıcıya bağlı olduğunda varsayılan işletim sistemi kullanıcı klasörüne park edilmiş karmaşık, daha büyük yapılandırmalar için SQLite. Her ikisi de kullanılabilir.


2

Windows'da, uygulama ayarını AppDataklasörde tutardım


1

Kullanıcı ayarları genellikle

/home/<user>/.<application> 

Yani örneğin irssi ayarları için /home//.irssi/config


Ancak bu bir Unix sözleşmesidir. Peki ya Windows? Ve Linux'ta, kullanıcı ana dizinini alt dizinlerle doldurmaz mı? Neden olmasın /home/<user>/etc/application?
Wizard79

@Lorenzo: Kullanıcının giriş dizinini doldurmak nadiren sorun olur.
Chinmay Kanchi

1
Yapılandırma ayarları, ~/.config/applicationişleri konsolide tutmaya yardımcı olmak için giderek daha fazla hale getiriliyor . Bu harekete katılıyorum.
greyfade

1
@Lorenzo: Bu, yapılandırma dosyalarını depolamak için kullanılan Windows kuralıyla tamamen aynıdır AppData.
greyfade

1
@Chris: mümkün değil! :-)
Wizard79

1

Bence tercih edilen platforma özgü mekanizmayı kullanmak en iyisidir. Örneğin, OS X'te, tercih edilen mekanizma ~ / Library / Preferences içine bir özellik listesi yerleştirmektir ve Kakao API'sı ayarları oradan saklamak ve almak için gerçekten basit bir arayüze sahiptir.

Uygulamanız çapraz platformsa, bunu bir sınıfla ya da başka bir şeyle soyutlayabilirsiniz.


0

Kayıt defterine yazdığım tek şey, uygulamanın konumudur, böylece yükleyiciler ve güncellemeler kolayca bulabilir. Diğer her şey / AppData / Company / App içindeki dosyalarda saklanır


-2

Java uygulamaları için gson'un iyi bir seçim olduğunu düşünüyorum . Ayar nesnelerinizi oluşturun ve gson'u kullanarak bunları JSON'a veya tam tersine dönüştürün. Bazı serileştirilmiş damlalar yerine insan tarafından okunabilir olma avantajına sahiptir.

Düzenleme: Tamam, bu yüzden belki de o kadar genel değil ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.