CLI фреймворк для Swift: создаём мощные консольные утилиты для iOS и macOS
Swift — это не только язык для мобильных приложений. С появлением Swift Package Manager (SPM) и таких фреймворков, как ArgumentParser, разработчики получили возможность создавать полноценные консольные инструменты для macOS и даже для iOS (в рамках серверных или CI/CD процессов). CLI (Command Line Interface) фреймворки для Swift позволяют парсить аргументы командной строки, обрабатывать флаги, опции и подкоманды, а также генерировать автоматическую справку.
В этой статье мы подробно разберём один из самых популярных и официальных CLI фреймворков — Swift ArgumentParser (разработка Apple). Вы узнаете, как установить его через SPM, написать простой консольный инструмент, добавить подкоманды и аргументы, а также увидите примеры кода для реальных задач.
Что такое CLI фреймворк для Swift?
CLI фреймворк — это библиотека, которая берёт на себя рутинную работу по разбору строки командной строки. Вместо того чтобы вручную писать циклы по CommandLine.arguments, вы описываете структуру команды декларативно: какие аргументы обязательны, какие опциональны, какие флаги поддерживаются. Фреймворк сам генерирует справку (--help) и обрабатывает ошибки ввода.
Основные возможности Swift ArgumentParser:
- Декларативное описание аргументов и опций
- Автоматическая генерация справки и версии
- Поддержка подкоманд (как в
git commitилиswift build) - Валидация типов (Int, String, Double и кастомные)
- Интеграция с SPM и Xcode
Установка через Swift Package Manager
Добавьте зависимость в Package.swift вашего проекта:
// swift-tools-version:5.9
import 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")
]
)
]
)
Теперь выполните swift build — библиотека будет загружена и скомпилирована.
Пишем первую команду
Создадим простую утилиту, которая приветствует пользователя по имени и возрасту.
import ArgumentParser
struct Greet: ParsableCommand {
@Argument(help: "Имя пользователя")
var name: String
@Option(name: .shortAndLong, help: "Возраст")
var age: Int?
mutating func run() throws {
if let age = age {
print("Привет, \(name)! Тебе \(age) лет.")
} else {
print("Привет, \(name)!")
}
}
}
Greet.main()
Запустите скомпилированный бинарник:
./MyCLITool "Анна" --age 25
# Вывод: Привет, Анна! Тебе 25 лет.
./MyCLITool "Максим"
# Вывод: Привет, Максим!
Автоматически сгенерированная справка (--help) покажет все аргументы и опции.
Подкоманды: структура как в реальных утилитах
Часто CLI инструменты имеют несколько подкоманд: create, delete, list. ArgumentParser поддерживает это из коробки.
import ArgumentParser
struct TaskManager: ParsableCommand {
static var configuration = CommandConfiguration(
subcommands: [Add.self, List.self, Delete.self]
)
}
struct Add: ParsableCommand {
@Argument(help: "Текст задачи")
var text: String
func run() {
print("Задача добавлена: \(text)")
}
}
struct List: ParsableCommand {
func run() {
print("Список задач:")
print("1. Купить продукты")
print("2. Написать статью")
}
}
struct Delete: ParsableCommand {
@Argument(help: "ID задачи")
var id: Int
func run() {
print("Задача \(id) удалена")
}
}
TaskManager.main()
Теперь можно запускать:
./TaskManager add "Выучить Swift"
# Вывод: Задача добавлена: Выучить Swift
./TaskManager list
# Вывод: Список задач: 1. Купить продукты 2. Написать статью