INI-tiation
Configurer un logiciel peut se faire de différentes façons. La première
est, par exemple, d’utiliser des options sur la ligne de commande. Cela
se fait au travers du paquetage Ada.Command_Line
ou encore plus
simplement au travers du paquetage GNAT.Command_Line
qui permet de
définir et de traiter simplement les options d’une ligne de commande.
Cela étant, aussi riches que peuvent être ces options, elles ont leurs limites et il faut envisager une autre approche.
La première qui nous vienne à l’esprit est d’utiliser un ou des fichiers de configuration (nous nous cantonnerons ici à un seul fichier au format texte).
Pour sa structure, mieux vaut s’appuyer sur des standards connus tels que : CSV, XML, JSON, YAML, TOML, INI, etc. Ces standards ont leurs avantages et leurs inconvénients et peuvent être interprétés nativement en Ada.
Dans ce bestiaire, les fichiers INI se caractérisent par leur simplicité, leur lisibilité et leur universalité (présents sous Linux, Windows). Cela étant, leur structure très « plate » ne permet pas de faire des choses élaborées comme le permet par exemple le format XML qui, pour le coup, n’est pas très « lisible ».
Dans la suite de cet article, nous allons présenter comment ce format INI peut être facilement utilisé au sein d’une application Ada.
Fichiers au format INI¶
Les fichiers .ini sont des fichiers texte facilement éditables. Ces
fichiers sont constitués de sections. Chaque section décrit des
paramètres. Une section commence par un titre placé entre crochets
[]
ne comportant aucun blanc. Un champ paramètre est décrit par
son identifiant suivi d’un champ contenant ses valeurs. Les deux champs
(paramètres et valeurs) sont séparés par un =
. Un commentaire
commence par le caractère #
et se termine à la fin de la ligne.
Le paquetage GNATCOLL.Config
¶
Ce paquetage permet de traiter de façon indifférenciée des fichiers de configuration au format texte.
L’implémentation par défaut prend en charge les fichiers .ini.
Exemple¶
Imaginons que nous souhaitions configurer un certain nombre de composants dans notre application.
Cela concerne :
- L’activation et/ou la configuration des IOs,
- La configuration d’une interface réseau,
- La configuration d’une interface MODBUS.
Cette configuration se fera au travers du fichier .ini suivant :
# Exemple de commentaire. [io] syslog = yes log = yes dir = $HOME [net] host = 192.168.1.59 port = 4264 cycle = 100 [modbus] addr = 16#1a# timeout = 300 cycle = 500
Alors, le code suivant basé sur GNATCOLL.Config
permettra d’accéder
facilement aux informations de configuration :
with GNATCOLL.Config, Ada.Text_IO, Ada.Environment_Variables; use GNATCOLL.Config, Ada.Text_IO, Ada.Environment_Variables; procedure Mon_Appli is INI_File : constant String := "mon_appli.ini"; C : INI_Parser; type Section_T is (IO, Net, Modbus); type Key_T is (Syslog, Log, Dir, --> io Cycle, --> net + modbus Host, Port, --> Addr, Timeout); --> modbus begin C.Configure (Home => Value ("HOME")); -- ! C.Open (INI_File); while not C.At_End loop declare Section : constant Section_T := Section_T'Value (C.Section); Key : constant Key_T := Key_T'Value (C.Key); Value : constant String := C.Value; begin Put_Line (Section'Img & ":" & Key'Img & ":" & Value); case Section is when IO => case Key is when Syslog => … end case; when Net => … end case; end; C.Next; end loop; end Mon_Appli;
Et l’exécution affichera entre autres :
IO:SYSLOG:yes
IO:LOG:yes
IO:DIR:/home/dupond
NET:HOST:192.168.1.59
NET:PORT:4264
NET:CYCLE:100
MODBUS:ADDR:16#1a#
MODBUS:TIMEOUT:300
MODBUS:CYCLE:500
…
On peut remarquer ici que la valeur de la clé dir
de notre fichier
.ini a été substituée par la valeur de la variable d’environnement
HOME
(ici /home/dupond
).
Conclusion¶
Mettre en œuvre un fichier .ini est extrêmement simple et cela répond bien souvent aux besoins de configurations d’applications plus ou moins exigeantes sur ce point. Si cela ne suffit pas, alors, il est toujours possible de s’orienter vers des solutions autour par exemple de xmlAda [2] mais cela se fera au détriment de la simplicité.
Commentaires