В Swift появилась библиотека, которая закроет старую боль Foundation.Process.
swift-subprocess - свежий пакет от Foundation Workgroup, уже принят как proposal SF-0007 v0.1.
Зачем это нужно:
Swift Subprocess - это единый и безопасный способ дергать внешние утилиты.
И это не что-то нишевое: почти все наши любимые Swift-тулы делают это под капотом:
• Tuist - дергает xcodebuild, swift build и десятки CLI команд
• Sourcery - запускает генераторы, линтеры и скрипты
• и любые pet-проекты, где надо позвать git, ffmpeg, convert, jq
Сегодня они используют старый Foundation.Process.
Завтра почти наверняка перейдут на swift-subprocess.
Примеры
Простой вызов:
let r = try await run(.name("git"),
arguments: ["--version"],
output: .string())
print(r.standardOutput)Логи «на лету»:
try await run(.name("bash"),
arguments: ["-lc", "ping -c 3 apple.com"]) { p in
for try await line in p.standardOutput.lines {
print("[OUT]", line)
}
}Параллельные процессы:
async let a = run(.name("echo"), arguments:["A"])
async let b = run(.name("echo"), arguments:["B"])
let (ra, rb) = try await (a, b)
print(ra.standardOutput, rb.standardOutput) // A B📱 На iOS запуск внешних бинарников запрещён.
Но код можно шарить с macOS/Linux-утилитами, а внутри iOS использовать те же async-паттерны для встроенных фреймворков.
Статус проекта
• Proposal SF-0007 принят (март 2025)
• Версия 0.1 уже доступна на GitHub
• Планируется 1.0 в ближайшие месяцы
💡 Итог: Swift Subprocess - новый стандарт для инструментов на Swift.
Очень скоро Tuist, Sourcery и многие другие утилиты переедут на него.
👉 Репо: github.com/swiftlang/swift-subprocess
