CLI framework para Swift: criando poderosas utilitários de console para iOS e macOS
Swift não é apenas uma linguagem para aplicativos móveis. Com o surgimento do Swift Package Manager (SPM) e de frameworks como o ArgumentParser, os desenvolvedores ganharam a capacidade de criar ferramentas de console completas para macOS e até mesmo para iOS (no contexto de processos server-side ou CI/CD). Frameworks CLI (Command Line Interface) para Swift permitem analisar argumentos de linha de comando, processar flags, opções e subcomandos, além de gerar ajuda automática.
Neste artigo, vamos detalhar um dos frameworks CLI mais populares e oficiais — o Swift ArgumentParser (desenvolvido pela Apple). Você aprenderá como instalá-lo via SPM, escrever uma ferramenta de console simples, adicionar subcomandos e argumentos, e verá exemplos de código para tarefas reais.
O que é um framework CLI para Swift?
Um framework CLI é uma biblioteca que assume o trabalho rotineiro de analisar a string da linha de comando. Em vez de escrever manualmente loops sobre CommandLine.arguments, você descreve a estrutura do comando de forma declarativa: quais argumentos são obrigatórios, quais são opcionais, quais flags são suportadas. O próprio framework gera a ajuda (--help) e lida com erros de entrada.
Principais recursos do Swift ArgumentParser:
- Descrição declarativa de argumentos e opções
- Geração automática de ajuda e versão
- Suporte a subcomandos (como em
git commitouswift build) - Validação de tipos (Int, String, Double e personalizados)
- Integração com SPM e Xcode
Instalação via Swift Package Manager
Adicione a dependência no Package.swift do seu projeto:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "MyCLITool", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLITool", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])Agora execute swift build — a biblioteca será baixada e compilada.
Escrevendo o primeiro comando
Vamos criar uma utilidade simples que saúda o usuário pelo nome e idade.
import ArgumentParser
struct Greet: ParsableCommand { @Argument(help: "Nome do usuário") var name: String
@Option(name: .shortAndLong, help: "Idade") var age: Int?
mutating func run() throws { if let age = age { print("Olá, \\(name)! Você tem \\(age) anos.") } else { print("Olá, \\(name)!") } }}
Greet.main()Execute o binário compilado:
./MyCLITool "Ana" --age 25# Saída: Olá, Ana! Você tem 25 anos.
./MyCLITool "Máximo"# Saída: Olá, Máximo!A ajuda gerada automaticamente (--help) mostrará todos os argumentos e opções.
Subcomandos: estrutura como em utilitários reais
Frequentemente, ferramentas CLI possuem vários subcomandos: create, delete, list. O ArgumentParser suporta isso nativamente.
import ArgumentParser
struct TaskManager: ParsableCommand { static var configuration = CommandConfiguration( subcommands: [Add.self, List.self, Delete.self] )}
struct Add: ParsableCommand { @Argument(help: "Texto da tarefa") var text: String
func run() { print("Tarefa adicionada: \\(text)") }}
struct List: ParsableCommand { func run() { print("Lista de tarefas:")
```