Seu primeiro CLI em Swift: da ideia à ferramenta pronta
\n\nVocê já se perguntou como são criados aqueles utilitários convenientes no terminal — curl, git, brew? Acontece que criar seu próprio utilitário CLI em Swift não é mais difícil do que fazer um aplicativo iOS simples. Além disso, Swift é ideal para isso: é rápido, seguro em termos de memória e funciona perfeitamente tanto no macOS quanto no Linux.
Neste artigo, criaremos do zero uma ferramenta de console completa que analisará argumentos, exibirá texto colorido e até mesmo tratará erros. Você aprenderá a configurar o projeto através do Swift Package Manager, conectar a poderosa biblioteca ArgumentParser e preparar o utilitário para publicação no Homebrew. Pronto? Vamos nessa!
\n\nPor que Swift para CLI é legal?
\n\nQuando se trata de criar ferramentas de linha de comando, muitos pensam imediatamente em Python, Bash ou Go. Mas Swift é o cavalo escuro que surpreende:
\n\n- \n
- Velocidade no nível do C — seu utilitário vai voar. \n
- Trabalho seguro com memória — sem segfaults ou vazamentos. \n
- Multiplataforma — Swift funciona perfeitamente no Linux, então seu CLI pode ser executado até em servidores. \n
- Sintaxe moderna — o código é lido como boa prosa. \n
- Ecossistema enorme — o Swift Package Manager (SPM) dá acesso a milhares de bibliotecas. \n
A propósito, se você já programa em Python e quer experimentar algo novo para CLI, Swift será uma excelente escolha: você obterá um binário nativo sem dependências e com consumo mínimo de memória.
\n\nConfiguração do projeto: Swift Package Manager
\n\nPrimeiro, vamos criar um novo projeto. Abra o terminal e execute:
\n\nmkdir MyCLI\ncd MyCLI\nswift package init --type executable\n\nO comando criará a estrutura padrão do SPM. Observe o arquivo Package.swift — é o coração do seu projeto. Vamos editá-lo para adicionar a dependência do Apple/Swift ArgumentParser:
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MyCLI",\n dependencies: [\n .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0")\n ],\n targets: [\n .executableTarget(\n name: "MyCLI",\n dependencies: [\n .product(name: "ArgumentParser", package: "swift-argument-parser")\n ]\n )\n ]\n)\n\nAgora execute swift build. O SPM baixará a biblioteca e compilará o projeto. Se tudo ocorrer bem — você está pronto para escrever código!
Escrevendo o primeiro comando: Hello World turbinado
\n\nVamos abrir Sources/MyCLI/main.swift e escrever um comando simples que exibe uma saudação. Mas não apenas "Hello, World!", usando argumentos:
import ArgumentParser\n\nstruct HelloCommand: ParsableCommand {\n static let configuration = CommandConfiguration(\n commandName: "hello",\n abstract: "Exibe uma saudação",\n discussion: "Use este comando para cumprimentar o mundo ou uma pessoa específica."\n )\n\n @Argument(help: "Nome da pessoa a ser cumprimentada")\n var name: String = "World"\n\n @Option(name: .shortAndLong, help: "Número de repetições")\n var count: Int = 1\n\n func run() throws {\n for _ in 0..<count {\n print("Olá, \\(name)! 👋")\n }\n }\n}\n\nHelloCommand.main()\n\nExecute: swift run MyCLI hello --count 3 "iOS Developer". Você verá:
Olá, iOS Developer! 👋\nOlá, iOS Developer! 👋\nOlá, iOS Developer! 👋\n\nObserve: Argumen