Tu primer CLI en Swift: de la idea a la herramienta lista
\n\n¿Alguna vez te has preguntado cómo se crean esas útiles utilidades en la terminal — curl, git, brew? Resulta que escribir tu propia utilidad CLI en Swift no es más difícil que hacer una simple aplicación iOS. Es más, Swift es ideal para esto: es rápido, seguro con la memoria y funciona perfectamente tanto en macOS como en Linux.
En este artículo crearemos desde cero una herramienta de consola completa que analizará argumentos, mostrará texto en color e incluso manejará errores. Aprenderás a configurar el proyecto con Swift Package Manager, conectar la potente biblioteca ArgumentParser y preparar la utilidad para su publicación en Homebrew. ¿Listo? ¡Vamos allá!
\n\n¿Por qué Swift para CLI es genial?
\n\nCuando se habla de crear herramientas de línea de comandos, muchos piensan inmediatamente en Python, Bash o Go. Pero Swift es un caballo oscuro que sorprende:
\n\n- \n
- Velocidad a nivel de C — tu utilidad volará. \n
- Trabajo seguro con la memoria — sin segfaults ni fugas. \n
- Multiplataforma — Swift funciona perfectamente en Linux, por lo que tu CLI se puede ejecutar incluso en servidores. \n
- Sintaxis moderna — el código se lee como buena prosa. \n
- Ecosistema enorme — Swift Package Manager (SPM) da acceso a miles de bibliotecas. \n
Por cierto, si ya escribes en Python y quieres probar algo nuevo para CLI, Swift será una excelente opción: obtendrás un binario nativo sin dependencias y con un consumo mínimo de memoria.
\n\nConfiguración del proyecto: Swift Package Manager
\n\nPrimero, creemos un nuevo proyecto. Abre la terminal y ejecuta:
\n\nmkdir MyCLI\ncd MyCLI\nswift package init --type executable\n\nEl comando creará la estructura estándar de SPM. Presta atención al archivo Package.swift — es el corazón de tu proyecto. Lo editaremos para añadir la dependencia de 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\nAhora ejecuta swift build. SPM descargará la biblioteca y compilará el proyecto. Si todo sale bien, ¡estás listo para escribir código!
Escribimos el primer comando: Hello World mejorado
\n\nAbramos Sources/MyCLI/main.swift y escribamos un comando simple que muestre un saludo. Pero no solo "Hello, World!", sino usando argumentos:
import ArgumentParser\n\nstruct HelloCommand: ParsableCommand {\n static let configuration = CommandConfiguration(\n commandName: "hello",\n abstract: "Muestra un saludo",\n discussion: "Usa este comando para saludar al mundo o a una persona específica."\n )\n\n @Argument(help: "Nombre de la persona a saludar")\n var name: String = "World"\n\n @Option(name: .shortAndLong, help: "Número de repeticiones")\n var count: Int = 1\n\n func run() throws {\n for _ in 0..<count {\n print("¡Hola, \\(name)! 👋")\n }\n }\n}\n\nHelloCommand.main()\n\nEjecuta: swift run MyCLI hello --count 3 "iOS Developer". Verás:
¡Hola, iOS Developer! 👋\n¡Hola, iOS Developer! 👋\n¡Hola, iOS Developer! 👋\n\nObserva: Argumen