Framework CLI pour Swift : création d'utilitaires console sur iOS et macOS
Le développement d'applications console (CLI — Command Line Interface) pour l'écosystème Apple est longtemps resté l'apanage de Python, Ruby ou Bash. Cependant, avec l'arrivée de Swift et de sa puissante boîte à outils, incluant Swift Package Manager (SPM), il est désormais possible de créer des utilitaires console rapides, typés et facilement maintenables dans le langage natif d'iOS/macOS. Dans cet article, nous examinerons en détail le framework principal pour construire des CLI en Swift — Apple's ArgumentParser, ainsi que des solutions alternatives.
Qu'est-ce qu'un framework CLI pour Swift ?
Un framework CLI est une bibliothèque qui prend en charge les tâches courantes d'analyse des arguments de ligne de commande, de génération d'aide, de gestion des erreurs et d'organisation des commandes. Dans le monde Swift, le standard de facto est ArgumentParser, développé par Apple et faisant partie de Swift Open Source. Il permet de décrire de manière déclarative l'interface de votre utilitaire, et tout le reste est fait automatiquement.
Principales fonctionnalités de ArgumentParser :
- Définition déclarative des commandes — vous décrivez la structure, et le framework analyse lui-même les arguments.
- Aide automatique — les drapeaux
--helpet-hsont générés automatiquement. - Prise en charge des commandes imbriquées (comme dans
gitouswift). - Validation des types — si un nombre est attendu mais qu'une chaîne est fournie, une erreur claire est affichée.
- Intégration avec SPM — il suffit d'ajouter une dépendance dans
Package.swift.
Installation et configuration
Pour travailler, vous aurez besoin de Swift 5.5+ (5.7 ou plus récent recommandé). Créez un nouveau projet console via SPM :
mkdir MyCLIcd MyCLIswift package init --type executableEnsuite, modifiez Package.swift en ajoutant une dépendance à ArgumentParser :
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyCLI", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLI", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])Maintenant, mettez à jour les dépendances et ouvrez le projet :
swift package updateopen Package.swift # ouvrira dans XcodeCréation de la première commande
Créez un fichier main.swift (ou Sources/MyCLI/main.swift) avec le contenu suivant :
import ArgumentParser
struct Greet: ParsableCommand { static let configuration = CommandConfiguration( abstract: "Salutation de l'utilisateur", discussion: "Cette commande affiche une salutation personnalisée." )
@Argument(help: "Nom de l'utilisateur") var name: String
@Option(name: .shortAndLong, help: "Nombre de répétitions") var count: Int = 1
@Flag(name: .shortAndLong, help: "Afficher la version") var verbose: Bool = false
mutating func run() throws { if verbose { print("Version 1.0.0") } for _ in 0..<count { print("Bonjour, \\(name)!") } }}
Greet.main()Maintenant, compilez et exécutez :
swift run MyCLI Swift --count 3# Sortie :# Bonjour, Swift!# Bonjour, Swift!# Bonjour, Swift!
swift run MyCLI --help# Usage: MyCLI <name> [--count <count>] [--verbose]# Salutation de l'utilisateur# ...Commandes imbriquées (sous-commandes)
Pour créer des utilitaires complexes (comme