티스토리 뷰
# Swift Pacakge Plugin
- Xcode 14 부터 Swift Package 를 만드는 것과 유사한 방식으로 Swift Package Plugin 을 만들 수 있다.
- 이 플러그인은 Swift 스크립트로 Swift 패키지나 Xcode 프로젝트에서 사용할 수 있다.
- 빌드 전이나 빌드 중에 실행되는 사용자 정의 명령 (ex. 소스코드 생성) 을 실행할 수 있다 .
이전에는 shell script 나 makefile 로 이런 작업을 했으나 이젠 플러그인을 만들어서 할 수 있는 것이다.
자동화, 공유 의 이점을 가져갈 수 있다.
- Xcode 는 플러그인을 컴파일하고 실행한다.
플러그인은 실행 파일과 입력 파일에 대한 정보를 사용해서 명령을 구성한다. 그리고 필요에 따라 Xcode 에 다시 보낸다.
- 하나 이상의 플러그인으로 패키지를 정의할 수 있다.
# Swift Pacakge Plugin 만들기
Plugins 폴더를 만들고 plugin.swift 를 정의한다.
PackagePlugin API 를 활용해서 코드를 작성한다.
plugin 타겟을 만든다.
# Swift Package Plugin 두 종류
1. Command Tool Plugin
- 일반적인 작업을 자동화하는 방법을 제공한다. (ex. 소스코드 포매터, 린터, 개발 워크플로우의 일환)
- 한번에 프로젝트나 패키지 전체를 구동한다.
- 이 플러그인은 사용자에 의해서만 직접 호출될 수 있다. 즉 사용자가 아래 커멘드를 직접 호출해서 사용한다.
swift package my-plugin --my-flag my-parameter
2. Build Tool Plugin
- 빌드 프로세스 중 파일을 생성할 때 사용할 수 있다.
- 필요한 대상에만 적용된다.
- 패키지나 Xcode 에 통합해서 사용한다. (이런 식으로)
- 두가지 종류로 나뉜다. 아래에서 살펴보겠다.
ㄴ Pre-build command
ㄴ In-build command
--------
참고로
두가지 종류의 플러그인을 모두 제공하고 있는 걸 볼 수 있다.
# Build Tool Plugin 두 종류
1. Pre-build command
- 빌드가 시작되기 전에 실행되며
명령을 실행하기 전에 예측할 수 없는 이름을 가진 임의 개수의 출력 파일을 생성할 수 있다.
- 명확한 출력이 없다면, Pre-build command 를 사용.
빌드가 시작될 때마다 실행된다. expensive work 를 조심해라.
2. In-build command
- 빌드 시스템의 종속성 그래프에 통합되며
사전 정의된 입력 및 출력의 존재 및 타임스탬프를 기반으로 빌드 중 적절한 시간에 실행된다.
- 정의된 출력이 있다면, In-build command 를 사용.
입력에 비해 출력이 오래 걸리면 빌드 시스템은 인빌드 명령을 자동으로 다시 실행한다.
예시
Pre-build 예시
- 코드에서 로컬라이즈드 된 코드를 추출해서 로컬 디렉토리를 만들어주는 플러그인
In-build 예시
- Asset Catalog 를 기반으로 코드를 만들어주는 플러그인
- output 은 auto generated file
🙄
SwiftLint 와 SwiftGen 모두 Build Tool Plugin 으로 in-build 가 아니라 pre-build 를 사용하고 있다.
WWDC 와 비슷한 사례인데 왜 pre-build 를 썼을 까.
무엇을 선택해야하나
빌드 명령은 명령이 실행되기 전에 모든 입력 및 출력의 경로가 알려진 경우 사전 빌드 명령보다 선호된다.
빌드 시스템을 사용하면 빌드 시스템에서 실행 시기를 보다 효율적으로 결정할 수 있기 때문이다.
이것은 실제로 매우 일반적이다.
예를 들어 각 입력 파일에 대해 하나의 출력 파일(예측 가능한 이름 포함)을 생성하는 소스 번역 도구 또는 도구를 먼저 실행하지 않고도 플러그인이 출력 이름을 제어할 수 있는 기타 경우가 포함된다.
사전 빌드 명령은 도구가 실행될 때까지 출력 이름을 알 수 없는 경우에만 사용해야한다.
이는 입력 파일의 내용 (이름이 아닌)이 출력 파일의 수와 이름을 결정하는 경우이다.
사전 빌드 명령은 모든 빌드 전에 실행되어야 하므로 증분 빌드 속도가 느려지는 것을 방지하기 위해
가능한 한 적은 작업을 수행하도록 자체 캐싱을 수행해야한다.
출처 문서
# TODO
SwiftLint 를 Build Tool Plugin 으로 사용해보면
빌드 속도가 매우 증가한다. (구체적인 결과는 추후 첨부하겠음)
pre-build 의 영향이 아닐까 싶은데 좀 더 찾아보자.
[ Reference ]
https://github.com/apple/swift-package-manager/blob/main/Documentation/Plugins.md#build-tool-plugins
https://developer.apple.com/wwdc22/110359
'🍏 > iOS' 카테고리의 다른 글
[iOS] Apple Intelligence > Genmoji (2) | 2024.07.04 |
---|---|
[iOS] 웹뷰 인스펙터, 웹뷰 디버깅 (0) | 2024.06.28 |
[Xcode] StaticLinker 의 release, debug 빌드 차이 (-export_dynamic, -no_deduplicate) (4) | 2024.04.20 |
[Xcode] Instruments - Swift Concurrency (1) | 2024.03.11 |
[Xcode] Instruments 로 Hang 개선하기 (8) | 2024.03.08 |
- Total
- Today
- Yesterday
- Dart Factory
- 플러터 싱글톤
- flutter 앱 출시
- Flutter Clipboard
- 장고 Custom Management Command
- ipad multitasking
- ribs
- Python Type Hint
- github actions
- Flutter getter setter
- cocoapod
- Sketch 누끼
- SerializerMethodField
- Django FCM
- 장고 URL querystring
- flutter build mode
- METAL
- Watch App for iOS App vs Watch App
- 구글 Geocoding API
- 플러터 얼럿
- Flutter Text Gradient
- Flutter Spacer
- flutter deep link
- Django Heroku Scheduler
- flutter dynamic link
- DRF APIException
- Flutter 로딩
- PencilKit
- Django Firebase Cloud Messaging
- drf custom error
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |