Swift Package Manager란 CocoaPods나 Carthage와 같이 프레임워크 디펜더스 관리를 해주는 도구이다. 그중에서 Swift Package Manager(이하 SPM)은 Xcode단에서 지원해주는 툴이며, 이를 이용해 깃허브 특정 리포지트에 패키지를 등록하고, 업데이트를 하며, 해당 리포지트를 다른 프로젝트에서 Import하여 사용할 수 있게 해준다.
자 그럼, 프레임워크를 SPM을 통해 특정 깃 허브 리포지트에 업로드하고 관리하는 방법부터 차근히 해보자.
SPM을 활용한 프레임워크 생성 및 업로드
SPM를 사용해서 Package를 임포트하기 위해 만들어진 패키지는 XCode의 상단 메뉴 File-New-Package를 누르면 Package파일을 만들 수 있다. 마치, 프레임워크 파일을 만들어서 CMD를 통해서 배포할 파일로 변경해서 올리듯 SPM을 통한 패키지를 관리할 때의 중심 파일은 위와 같은 경로로 만들어지는 Package파일이 되는 것이다.
패키지를 생성할 때, 패키지 이름을 설정하고 생성을 누르면 아래와 같이 프로젝트 네비게이터에 README, Package.swift, Sources, Tests라는 파일 및 폴더들이 생긴다. README는 말그대로 해당 패키지를 사용할 유저를 위한 가이드를 적으면 되는 파일이다. 핵심은 Package.swift인데, 해당 파일을 보면 let 상수 하나의 package라고 있는데, 이는 Package라는 Class 객체인데, 내부에는 다양한 옵션으로 해당 패키지의 디펜던스를 결정할 수 있다. 이 옵션들에 대해서 간략하게 알아보자.
platforms
[SupportedPlatform]이 자료형인 파라미터로 macOS/iOS/tvOS/watchOS 의 각 플랫폼 별로 사용가능한 버전을 명시할 수 있다. 일반적인 String형태로도 쓸 수 있고, 제공되는 Enum값으로도 셋팅이 가능하다.
cLanguageStandard
패키지에서 C 소스를 컴파일링 하는데 사용하는 지원되는 C 언어 기준이다. c89, c90, iso9899_2011 등등 다양한 case가 있다. 패키지에 C언어 소스를 사용해야한다면 기준을 둬서 지원하지 않는 C 언어 버전이면 못쓰게하면 될 것 같다.
CXXLanguageStandard
위 cLanguageStandard가 C 언어에 대한 제약조건을 명시하는 거라면 CXX는 C++ 버전이라고 보면 된다.
LanguageTag
IETF 언어 테그라고 한다.. defaultLocalization의 파라미터로 전달되는 데 정확히 어떤 의미로 사용되는 지 모르겠다.
dependencies
[Package.Dependency]이 자료형인 파라미터로 해당 패키지에서 다른 패키지를 사용할 때 반드시 디펜던시가 존재해야함을 의미한다. 내부적으로 보면 패키지 디펜던시 정확한 버전, 버전 범위, 출시 버전, 브랜치 이름등 다양한 옵션들이 있고, 이는 다른 프로젝트에서 특정 패키지를 임포트할 때의 옵션과 동일해보인다.
providers
[SystemPackageProvider]이 자료형인 파라미터로 Enum이며 케이스는 brewItem/aptItem이 두가지만 있고 각 케이스별로 String파라미터 하나를 받는다. 해당 패키지에서 사용되는 시스템 패키지 프로바이더를 명시한다.
swiftLanguageVersions
[SwiftVersion]이 자료형인 파라미터로 해당 패키지에 있는 Swift 소스 파일들을 컴파일링 하기 위해 사용되는 스위프트의 레벨을 명시한다.
targets
[Target]이 자료형인 파라미터로 스위프트 패키지의 기본 빌딩 블락을 의미한다. regular/executable/test/system/binary/plugin 등 다양한 옵션이 있지만, 이건 사용하면서 필요할 때마다 한 번 찾아보는 것이 좋아보인다.
여튼, 이렇게 다양한 패키지 제약조건 옵션들이 있지만, 다 적용해보기엔 경우의 수가 너무 많아서 힘들고 나는 PHPickerViewController를 사용하는 프레임워크를 만들어서 SPM으로 배포하려고 한다. 참고로 PHPickerViewController는 iOS 14.0부터 지원되며 그 중에 Configuration 중 하나의 옵션은 iOS 15.0부터 지원하기 때문에 최소 사용 iOS 버전만 15.0으로 제약을 두려고 한다. 이럴 때 아러처럼 적어주면 된다.
Framework를 만들듯이, Sources 그룹아래로 프레임워크를 만들자
PHPickerViewController를 사용해서 피커를 열고, 열 때 권한을 물어보고 다음에 딜리게이트로 결과를 PHAsset으로 받는 형태로 만드는 소스를 개발하였다. 일반적으로 XCode에서 프레임워크를 만들어서 만든 소스를 다른 프로젝트에서 임의로 Import하듯이 소스 그룹안에 만들면 되겠다. 프레임워크 소스는 깃허브사이트에서 볼 수 있다.
만든 프레임워크를 Github의 특정 리포지트에 올리기
이 부분은 사실 일반적인 프로젝트와 다르지 않다.
패키지가 존재하는 디렉토리 내에서 git init을 실행하고, 첫 번째 커밋을 만들고 올리고 싶은 리포지트 URL을 복사해서 리모트를 만들어준뒤 Push만 해주면 된다.
다른 프로젝트에서 SPM을 통해 패키지를 Import하기
프로젝트안에서 위 git url 리포지트에 올라간 패키지를 import하고 싶다면, 아래와 같이 진행하면 된다.
프로젝트 최상단 프로젝트 파일을 우클릭하고 Add Packages를 누른다.
누르면 다양한 패키지들이 들어있는 창이 하나 띄워지는데, 이번엔 우리가 깃 리포지트에 추가한 패키지를 import할 것이기 때문에 복사한 Git URL을 우측 서칭에 넣고 검색하면 바로 패키지가 뜬다. 해당 패키지를 누르면 우측에 패키지 디펜던시 룰을 설정할 수 있다.
해당 프로젝트가 사용할 패키지의 버전에 대한 룰을 결정하는 것으로 다음 메이저 버전까지, 다음 마이너 버전까지, 버전 범위, 정확한 버전, 그리고 해당 패키지의 브랜치, 커밋 번호까지 다양한 룰이 있으니 원하는 입맛대로 진행하면 되겠다.
나는 딱히 버전까지는 릴리즈에 추가 안했기 때문에 브랜치 - master로 진행하였다.
이렇게 하단에 패키지 디펜던시가 생기면 이젠 프레임워크를 import하여 사용할 준비가 끝난것이다.
추가 : 패키지 제거하기
패키지를 제거하는 방법은 프로젝트 파일에 패키지 디펜던시를 누르고 지울 패키지를 누른다음 하단에 - 버튼을 누르면 제거된다.
'스위프트' 카테고리의 다른 글
[Swift] FileManager에 대해 알아보자 (0) | 2022.02.23 |
---|---|
[Swift] CGAffineTransform 제대로 이해하기 (0) | 2022.02.15 |
[Swift] UICollectionViewDrag & DropDelegate (0) | 2022.01.17 |
[CoreGraphics] CGContext를 통해 뷰를 커스터마이징하게 그려보자 (0) | 2022.01.17 |
[Swift] UIViewControllerTransitioningDelegate를 사용하여 Transition을 통해 뷰 컨트롤러를 Present/Dismiss 해보자 - 2편 (0) | 2021.12.30 |