티스토리 뷰

🍏/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

반응형
댓글