Asıl soru şudur: Konfigürasyon dosyanızın bazı Turing dillerinde (Python gibi) olmasını ister misiniz? Bunu istiyorsun, ayrıca bazı gömme düşünebilirsiniz diğer benzeri (Turing tam) kodlama dili Guile veya Lua bölümünü okumak; "daha basit" kullanmak veya Python olandan, gömmek için orada algılanabilecek çünkü ( Genişletme & Python Katıştırma ). Bunu daha fazla tartışmayacağım (çünkü Amon tarafından verilen diğer cevaplar - bunu derinlemesine tartıştım) ancak uygulamanıza bir betik dili yerleştirmenin çok erken düşünmeniz gereken önemli bir mimari seçim olduğuna dikkat edin.; Bu seçimi daha sonra yapmayı gerçekten tavsiye etmiyorum!
"Scriptler" ile yapılandırılabilen bir programın iyi bilinen bir örneği GNU emacs editörüdür (veya özel mülkiyette AutoCAD ); bu nedenle komut dosyası kabul ederseniz, bazı kullanıcıların sonunda sizin açınızdan ve belki de kötüye kullanmaya başladığına göre, bu tesisi kapsamlı bir şekilde kullanacağını ve çok bin satırlık bir komut dosyası oluşturacağını; bu nedenle, yeterince iyi bir kodlama dili seçimi önemlidir.
Bununla birlikte (en azından POSIX sistemlerinde), "dosya" yapılandırmasının başlatma sırasında dinamik olarak hesaplanabilmesini (tabii ki, aklı başında bir konfigürasyonun yükünü sistem yöneticinize veya kullanıcıya bırakarak) etkinleştirmek için uygun olduğunu düşünebilirsiniz. bir dosyadan veya bir komuttan gelen metin ) Bunun için, örneğin a veya a ile başlayan bir konfigürasyon dosyası yolunun aslında bir boru hattı olarak okuyacağınız bir kabuk komutu olduğu konvansiyonunu kabul edebilirsiniz (ve belgeleyin ) . Bu, kullanıcınıza en aşina olduğu "önişlemci" veya "betik dili" ni kullanma seçeneği sunar.!
|
(dinamik olarak hesaplanan bir yapılandırmayı kabul ediyorsanız, kullanıcıya güvenlik sorunları konusunda güvenmeniz gerekir)
Yani başlangıç kodunuzda, main
(örneğin) bazı --config
argümanları kabul confarg
edip onlardan bir miktar alırsınız FILE*configf;
. Bu argüman ile başlarsa !
(yani eğer (confarg[0]=='!')
....), configf = popen(confarg+1, "r");
o boruyu kullanır ve kapatırdın pclose(configf);
. Aksi takdirde configf=fopen(confarg, "r");
bu dosyayı kullanır ve kapatırsınız fclose(configf);
(hata kontrolünü unutmayın). Bkz borusu (7) , popen (3) , Fopen (3) . Python ile kodlanmış bir uygulama için , os.popen , vs. hakkında okuyun ...
(ayrıca yukarıdaki numarayı atlamak !foo.config
için geçmek ./!foo.config
üzere adlandırılmış bir yapılandırma dosyasını geçmek isteyen garip kullanıcı için de geçerlidir popen
)
BTW, böyle bir hile sadece bir kolaylıktır (gelişmiş kullanıcının örneğin bir yapılandırma dosyası oluşturmak için bazı kabuk komut dosyası kodlamasını gerektirmesini önlemek için ). Kullanıcı herhangi bir hatayı bildirmek isterse, size oluşturulan yapılandırma dosyasını göndermelidir ...
Uygulamanızı , başlatma sırasında eklentileri kullanma ve yükleme kabiliyetine sahip olarak da tasarlayabileceğinizi , örneğin dlopen (3) kullanarak (ve bu eklenti hakkında kullanıcınıza güvenmeniz gerekir) dikkat edin. Yine, bu çok önemli bir mimari karardır (ve bu eklentiler ve uygulamanızla ilgili oldukça istikrarlı bir API ve kongre tanımlamanız ve sağlamanız gerekir ).
Python gibi bir betik dilinde kodlanmış bir uygulama için, eval veya exec ya da benzeri ilkeler için bazı program argümanlarını da kabul edebilirsiniz . Yine, güvenlik sorunları daha sonra (gelişmiş) kullanıcının endişesidir .
Yapılandırma dosyanızın metin biçimiyle ilgili olarak (oluşturulsun veya oluşturulmasın), çoğunlukla iyi bir şekilde belgelemeniz gerektiğine inanıyorum (ve belirli bir biçimin seçilmesinin o kadar önemli değil ; bazı -skipped- içindeki yorumlar). JSON'u (tercihen bazı JSON ayrıştırıcıları //
eol veya /*
... */
... olana kadar normal olan yorumları kabul edip atlayarak ) veya YAML veya XML veya INI veya kendi işinizi kullanabilirsiniz. Bir yapılandırma dosyasını ayrıştırmak oldukça kolaydır (ve bu görevle ilgili birçok kitaplık bulacaksınız).