Pertanyaan utamanya adalah: apakah Anda ingin file konfigurasi Anda berada dalam beberapa bahasa lengkap Turing (seperti Python)? Jika Anda ingin itu, Anda mungkin juga mempertimbangkan embedding beberapa lainnya (Turing lengkap) bahasa scripting seperti Guile atau Lua (karena ada bisa dianggap sebagai "sederhana" untuk menggunakan, atau untuk menanamkan, dari Python adalah; membaca bab tentang Memperluas & Embedding Python ). Saya tidak akan membahas hal itu lebih lanjut (karena jawaban lain - oleh Amon - bahas secara mendalam) tetapi perhatikan bahwa menanamkan bahasa skrip ke dalam aplikasi Anda adalah pilihan arsitektur utama , yang harus Anda pertimbangkan sejak dini.; Saya benar-benar tidak merekomendasikan membuat pilihan itu nanti!
Contoh terkenal dari program yang dapat dikonfigurasi melalui "skrip" adalah editor emacs GNU (atau mungkin AutoCAD di ranah kepemilikan); jadi ketahuilah bahwa jika Anda menerima skrip, beberapa pengguna akhirnya akan menggunakan - dan mungkin menyalahgunakan, di sudut pandang Anda - fasilitas itu secara luas dan membuat skrip multi-ribu baris; karena itu pilihan bahasa scripting yang cukup baik adalah penting.
Namun (setidaknya pada sistem POSIX), Anda mungkin mempertimbangkan untuk mengaktifkan "file" konfigurasi untuk dihitung secara dinamis pada waktu inisialisasi (tentu saja, meninggalkan beban konfigurasi yang waras kepada admin atau pengguna sistem Anda; sebenarnya itu adalah konfigurasi teks yang berasal dari beberapa file atau dari beberapa perintah). Untuk itu, Anda bisa langsung mengadopsi konvensi (dan mendokumentasikannya ) bahwa path file konfigurasi yang dimulai dengan misalnya a !
atau a |
sebenarnya adalah perintah shell yang akan Anda baca sebagai pipa . Ini membuat pengguna Anda memiliki pilihan untuk menggunakan "preprocessor" atau "bahasa scripting" apa pun yang paling dikenalnya.
(Anda perlu mempercayai pengguna Anda tentang masalah keamanan jika Anda menerima konfigurasi yang dihitung secara dinamis)
Jadi dalam kode inisialisasi Anda, Anda main
akan (misalnya) menerima beberapa --config
argumen confarg
dan mendapatkan beberapa FILE*configf;
darinya. Jika argumen itu dimulai dengan !
(yaitu jika (confarg[0]=='!')
....), Anda akan menggunakan configf = popen(confarg+1, "r");
dan menutup pipa itu dengan pclose(configf);
. Kalau tidak, Anda akan menggunakan configf=fopen(confarg, "r");
dan menutup file itu dengan fclose(configf);
(jangan lupa memeriksa kesalahan). Lihat pipa (7) , popen (3) , fopen (3) . Untuk aplikasi yang dikodekan dalam Python, baca tentang os.popen , dll ...
(mendokumentasikan juga untuk pengguna aneh yang ingin meneruskan file konfigurasi yang dinamai !foo.config
untuk melewati ./!foo.config
untuk memotong popen
trik di atas)
BTW, trik semacam itu hanya kenyamanan (untuk menghindari mengharuskan pengguna tingkat lanjut untuk misalnya kode beberapa skrip shell untuk menghasilkan file konfigurasi ). Jika pengguna ingin melaporkan bug apa pun, ia harus mengirimi Anda file konfigurasi yang dihasilkan ...
Perhatikan bahwa Anda juga dapat merancang aplikasi Anda dengan kemampuan untuk menggunakan dan memuat plugin pada saat inisialisasi, misalnya dengan dlopen (3) (dan Anda perlu mempercayai pengguna Anda tentang plugin itu). Sekali lagi, ini adalah keputusan arsitektur yang sangat penting (dan Anda perlu mendefinisikan dan menyediakan beberapa API dan konvensi yang agak stabil tentang plugin ini dan aplikasi Anda).
Untuk aplikasi yang dikodekan dalam bahasa scripting seperti Python, Anda juga dapat menerima beberapa argumen program untuk eval atau exec atau primitif serupa. Sekali lagi, masalah keamanan menjadi perhatian pengguna (lanjut) .
Mengenai format teks untuk file konfigurasi Anda (baik itu dihasilkan atau tidak), saya percaya bahwa Anda sebagian besar perlu mendokumentasikannya dengan baik (dan pilihan beberapa format tertentu tidak begitu penting; namun saya sarankan agar pengguna Anda dapat menempatkan beberapa komentar-dilewati- di dalamnya). Anda dapat menggunakan JSON (lebih disukai dengan beberapa parser JSON yang menerima dan melewatkan komentar dengan biasa //
sampai eol atau /*
... */
...), atau YAML, atau XML, atau INI atau hal Anda sendiri. Parsing file konfigurasi cukup mudah (dan Anda akan menemukan banyak perpustakaan yang terkait dengan tugas itu).