-
[WWDC 2022] Meet Swift Package pluginsWWDC 정리/2022 2025. 12. 1. 13:12반응형
https://developer.apple.com/videos/play/wwdc2022/110359/
Meet Swift Package plugins - WWDC22 - Videos - Apple Developer
Discover how you can perform actions on Swift packages and Xcode projects with Swift package plugins. We'll go over how these plugins...
developer.apple.com
Swift Package plugins는 Xcode 14에서 도입된 기능, Swift 5.6 부터 사용 가능
Swift 패키지와 Xcode 프로젝트에 대해 작업을 수행할 수 있는 Swift 스크립트
개발 워크플로우를 자동화하고, 빌드 중 소스 코드를 생성하거나 릴리스 작업을 자동화할 수 있습니다Swift Package Plugin이란

정의: Swift 패키지나 Xcode 프로젝트에서 작업을 수행할 수 있는 Swift 스크립트
주요 특징:
- Swift 패키지로 구현됨
- Xcode가 제공하는 전용 API 사용
- 하나 이상의 소스 파일로 구성 가능
- 한 패키지에서 여러 플러그인 정의 가능
SPM에 선언하는 방식
// swift-tools-version: 5.7 import PackageDescription let package = Package( name: "CoreLib", dependencies: [ .package(url: "git.../MySourceGenPlugin.git", from: "1.0.0") ], targets: [ .target( name: "CoreLib", plugins: [ .plugin(name: "MySourceGenBuildTool", package: "MySourceGenPlugin") ] ) ], )플러그인의 두 가지 유형
Command plugin, Build tool plugin으로 구분


1. Command Plugins (커맨드 플러그인)


Xcode 내부에서 실행 시킬 때, CLI 환경에서도 실행 가능 언제 쓰면 좋을까 ? - 원할 때마다 실행 가능한 커스텀 액션 구현
기능:
- 소스 코드 포매터나 린터 실행
- Git 히스토리 기반 contributor 목록 업데이트
- 소스 파일의 저작권 날짜 업데이트
- 코드 메트릭 계산이나 리포트 생성
권한:
- 파일 수정 권한 요청 가능 (사용자 승인 필요)
- 일부는 읽기 전용으로 동작 가능
2. Build Tool Plugins (빌드 도구 플러그인)
빌드 시스템의 의존성 그래프 확장
기능:
- 빌드 중 소스 코드나 리소스 생성
- 빌드 또는 빌드 전에 실행되는 커맨드 정의
- 타겟별로 적용됨
특징:
- 즉시 작업을 수행하지 않고, 빌드 도구 호출(invocation)을 반환
- 출력물은 빌드 디렉토리에 작성되어 증분 빌드 간 유지됨
- 입력/출력 경로를 지정하여 필요할 때만 실행
플러그인 동작 방식

필요할 때 컴파일되고 실행되는 Swift 스크립트
- 각 플러그인은 별도 프로세스로 실행
샌드박스 환경에서 실행 (네트워크 접근 차단)
접근 가능한 정보:
- 입력 패키지의 정제된 표현 (소스 파일 포함)
- 패키지 의존성 정보
- Foundation 등 표준 라이브러리 사용 가능
플러그인
- Xcode로 결과를보내 경고와 에러를 알려줌
API 사용법
PackagePlugin 프레임워크를 사용함
https://docs.swift.org/swiftpm/documentation/packageplugin/
Documentation
docs.swift.org
Command plugins
- 개발 워크플로를 확장함
- 빌드 중에는 되지않음
- 파일시스템 수정시에는 권한 요청을 해야함
import PackagePlugin @main // 플러그인을 실행하는 진입점 struct MyPlugin: CommandPlugin { func performCommand(context: PluginContext, arguments: [String]) throws {} }- CommandPlugin 프로토콜, performCommand 구현

swift package plugin --list- Package.swift 가 있는 디렉토리에서 명령어를 수행할 수 있음
- 명령어를 통해서 플러그인 리스트를 알 수 있음
swift package plugin <package_name>- CI나 다른 빌드 자동화 시스템 중에 사용 가능
Build Tool Plugin
- 즉시 작업을 실행하지않음
- 소스에서 제공 받은 executable을 호출할 수 있음
- 빌드 중이나 전후에 실행할 명령을 정의 할 수 있음
- 네트워크와 같은 외부 환경과 분리 된 샌드박스에서 실행 됨
import PackagePlugin @main // 플러그인을 실행하는 진입점 struct MyPlugin: BuildToolPlugin { func createBuildCommands( context: PluginContext, target: Target ) throws -> [Command] { } }- BuildToolPlugin 프로토콜, createBuildCommands 구현
- 패키지를 만들 때 반환 된 [Command] 가 실행 됨
동작
- 소스 코드나, 리소스 생성에 유리함
Build commands
- 보통 빌드 명령은 입출력 경로를 명시하며 출력이 사라질 때나, 입력이 변경될 때만 실행됩니다
Prebuild commands
- 빌드 시작 전에 실행되며, 미리 출력명을 모를 때 사용할 수 있음