Analyser les options de ligne de commande dans Groovy

  • FrançaisFrançais



  • Un article récent a fourni une introduction à l’analyse des options de ligne de commande en Java. Parce que j’aime beaucoup Groovy, et parce que Groovy est bien adapté pour les scripts, et parce que c’est amusant de comparer les solutions Java et Groovy, j’ai décidé de paraphraser l’article de Seth, mais en utilisant Groovy.

    Installer Groovy

    Groovy est basé sur Java, il nécessite donc une installation Java. Une version récente et décente de Java et de Groovy peut se trouver dans les référentiels de votre distribution Linux. Alternativement, vous pouvez installer Groovy en suivant les instructions sur le groovy-lang.org.

    Une bonne alternative pour les utilisateurs de Linux est SDKMan, qui peut être utilisé pour obtenir plusieurs versions de Java, Groovy et de nombreux autres outils connexes. Pour cet article, j’utilise la version OpenJDK11 de ma distribution et la dernière version Groovy de SDKMan.

    Analyser les options de ligne de commande dans Groovy

    Lorsque nous créons un script, une sorte de programme court, souvent informel, à exécuter à partir de la ligne de commande, nous suivons normalement la pratique consistant à passer des arguments au script sur la ligne de commande. Un bon exemple en est le ls commande, utilisée pour lister tous les fichiers et sous-dossiers d’un dossier donné, montrant peut-être les attributs et triés dans l’ordre inverse de la date de dernière modification, comme dans :

    $ ls -lt /home/me

    Pour afficher le contenu de mon dossier personnel comme ceci :

    total 252
    drwxr-xr-x 5 me me 4096 Aug 10 12:23 Downloads
    drwx------ 11 me me 4096 Aug 10 08:59 Dropbox
    drwxr-xr-x 27 me me 12288 Aug 9 11:58 Pictures
    -rw-rw-r-- 1 me me 235 Jul 28 16:22 wb.groovy
    drwxr-xr-x 2 me me 4096 Jul 20 22:04 Desktop
    drwxrwxr-x 2 me me 4096 Jul 20 15:16 Fixed
    drwxr-xr-x 2 me me 16384 Jul 19 08:49 Music
    -rw-rw-r-- 1 me me 433 Jul 7 13:24 foo
    drwxr-xr-x 6 me me 4096 Jun 29 10:25 Documents
    drwxr-xr-x 2 me me 4096 Jun 14 22:15 Templates
    -rw-rw-r-- 1 me me 803 Jun 14 11:33 bar

    Bien sûr, les arguments des commandes peuvent être traités en les inspectant et en décidant quoi faire dans chaque cas ; mais cela finit par être une duplication d’efforts qui peut être évitée en utilisant une bibliothèque conçue à cet effet.

    L’article Java de Seth présente le Bibliothèque de la CLI Apache Commons, une excellente API pour gérer les options de ligne de commande. En fait, cette bibliothèque est tellement géniale que les bonnes personnes qui développent Groovy la rendent disponible par défaut dans l’installation de Groovy. Par conséquent, une fois Groovy installé, vous avez accès à cette bibliothèque via groovy.cli.picocli.CliBuilder, qui est déjà importé pour vous par défaut.

    Voici un script Groovy qui utilise ce générateur CLI pour obtenir les mêmes résultats que le programme Java de Seth :

    1 def cli = new CliBuilder(usage: 'ho.groovy [-a] -c')
    2 cli.with {
    3    a longOpt: 'alpha', 'Activate feature alpha'
    4    c longOpt: 'config', args:1, argName: 'config', required: true, 'Set config file'
    5 }
    6 def options = cli.parse(args)
    7 if (!options) {
    8    return
    9 }
    10 if (options.a) {
    11    println' Alpha activated'
    12 }
    13 if (options.c) {
    14    println "Config set to ${options.c}"
    15 }

    J’ai inclus des numéros de ligne ici pour faciliter la discussion. Enregistrez ce script sans les numéros de ligne dans un fichier appelé ho.groovy.

    A la ligne 1, on définit la variable cli et définissez-le sur une nouvelle instance de CliBuilder avec une définition usage attribut. Il s’agit d’une chaîne qui sera imprimée si le usage() méthode est appelée.

    Sur les lignes 2 à 5, nous utilisons les avec() méthode que Groovy ajoute aux objets, ainsi que le DSL défini par CliBuilder, pour configurer les définitions d’options.

    A la ligne 3, on définit l’option ‘une‘, en définissant son longOpt champ à ‘alpha‘ et sa description à ‘Activer la fonctionnalité alpha‘.

    De même, à la ligne 4, nous définissons l’option ‘c‘, en définissant son longOpt champ à ‘configuration‘ et en spécifiant que cette option prend un argument dont le nom est ‘configuration‘. De plus, il s’agit d’un obligatoire option (ça a l’air drôle, je sais), et sa description est ‘Définir le fichier de configuration‘.

    En faisant une brève pause ici pour un peu de contexte, vous pouvez tout lire sur ces différentes options au CliBuilder lien ci-dessus. Plus généralement, les choses écrites sous la forme longOpt : ‘alpha’ sont une notation Groovy pour les entrées clé-valeur à mettre dans un Carte exemple, que vous pouvez lire sur ici. Chaque clé, dans ce cas, correspond à une méthode du même nom fournie par le CliBuilder. Si vous vous demandez ce qui se passe avec une ligne comme :

    a longOpt: 'alpha', 'Activate feature alpha'

    alors il peut être utile de mentionner que Groovy nous permet de laisser tomber les parenthèses dans certaines circonstances ; donc ce qui précède est équivalent à :

    a(longOpt: 'alpha', 'Activate feature alpha')

    c’est-à-dire que c’est un appel de méthode. De plus, Groovy autorise à la fois les paramètres positionnels et nommés, ces derniers utilisant cette syntaxe key: value.

    En avant! Aux lignes 6-9, nous appelons le analyser () méthode de la CliBuilder exemple cli, en passant le arguments—un étalage de Chaîne de caractères valeurs créées par le runtime Groovy et contenant les arguments de la ligne de commande. Cette méthode renvoie un Carte des options où les touches sont la forme abrégée des options prédéfinies — dans ce cas, ‘une‘ et ‘c‘. Si l’analyse échoue, alors analyser () émet le usage message, un message d’erreur raisonnable, et renvoie une valeur nulle, nous n’avons donc pas à utiliser un bloc try-catch (que l’on ne voit pas aussi souvent dans Groovy). Alors ici—ligne 8—nous venons de rentrer puisque tout notre travail est fait pour nous.

    Aux lignes 10-12, nous vérifions si l’option ‘une‘ a été inclus sur la ligne de commande et si c’est le cas, imprimez un message le disant.

    De même, aux lignes 13-15, nous vérifions si l’option ‘c‘ a été inclus sur la ligne de commande et si c’est le cas, affiche un message indiquant l’argument qui lui est fourni.

    Exécuter la commande

    Exécutons le script plusieurs fois ; d’abord sans arguments :

    $ groovy ho.groovy
    error: Missing required option: c
    usage: ho.groovy [-a] -c
     -a,--alpha Activate feature alpha
     -c,--config <config> Set config file
    $

    Notez la plainte concernant l’absence de l’option requise ‘c‘.

    Puis avec le ‘c‘ option mais pas d’argument :

    $ groovy ho.groovy -c
    error: Missing argument for option: c
    usage: ho.groovy [-a] -c
     -a,--alpha
    Activate feature alpha
     -c,--config <config> Set config file
    $

    Cool, le CliBuilder méthode d’instance analyser () remarqué qu’aucun argument n’a été fourni à ‘c‘.

    Enfin, essayons avec les deux options et un argument à ‘c‘, dans leur forme longue :

    $ groovy ho.groovy --alpha --config bar
    Alpha activated
    Config set to bar
    $

    Cela semble bon!

    Depuis l’idée du ‘c‘ est de fournir un fichier de configuration, nous pourrions également dire au CliBuilder exemple que le type de cet argument est File, et il le renverra au lieu d’une String. Mais nous laisserons cela pour un autre jour.

    Alors, voilà : analyse des options de ligne de commande dans Groovy.

    Ressources Groovy

    Le site Web de Groovy contient une grande documentation. Une autre excellente ressource Groovy est M. Haki, et plus précisément ce bel article sur CliBuilder.

    Une autre bonne raison d’apprendre Groovy est Graals, un framework web full-stack merveilleusement productif construit sur d’excellents composants comme Hibernate, Spring Boot et Micronaut.

    Source

    N'oubliez pas de voter pour cet article !
    1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
    Loading...

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée.