티스토리 뷰

🍏/iOS

[Xcode] Swift Package Plugin

eungding 2024. 4. 30. 18:25
728x90
반응형

# 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 

 

 

 

--------

참고로 

SwiftLintSwiftGen을 보면

두가지 종류의 플러그인을 모두 제공하고 있는 걸 볼 수 있다. 

 

 

#  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

 

swift-package-manager/Documentation/Plugins.md at main · apple/swift-package-manager

The Package Manager for the Swift Programming Language - apple/swift-package-manager

github.com

 

 

https://developer.apple.com/wwdc22/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

 

 

https://developer.apple.com/wwdc22/110401

 

Create Swift Package plugins - WWDC22 - Videos - Apple Developer

Tailor your development workflow and learn how to write your own package plugins in Swift. We'll show you how you can extend Xcode's...

developer.apple.com

반응형
댓글

eungding님의
글이 좋았다면 응원을 보내주세요!