1️⃣ Swift Package & Swift Package Manager
🤔 Swift Package란?
코드 모듈을 재사용 가능하고 쉽게 배포할 수 있도록 만든 구조화된 패키지입니다.
패키지를 사용하면 코드의 재사용성을 높이고, 의존성을 쉽게 관리하며, 프로젝트의 유지 보수를 용이하게 할 수 있습니다.
패키지는 Swift 소스파일과 Package.swift라는 매니페스트파일로 구성됩니다.
Package.swift는 PackageDescription 모듈을 사용하여 패키지 이름과 내용을 정의합니다.
패키지는 하나 이상의 Target이 존재하고, 각각의 Target은 Product를 지정하고 하나 이상의 의존성을 선언할 수 있습니다.
🤔 Swift Package Manager(SwiftPM)란?
Swift Package Manager는 Swift 코드의 "패키지" 배포 및 사용을 관리하는 도구입니다. 이 도구는 Swift 빌드 시스템과 통합되어 의존성을 다운로드, 컴파일, 링크하여 타겟 제품에 자동으로 통합하는 과정을 자동화합니다.
SwiftPM은 패키지 생성 및 관리, 버전 관리, 의존성 관리, 빌드 및 테스트 등을 쉽게 수행할 수 있도록 도와주는 Apple에서 공식적으로 지원하는 도구입니다.
SwiftPM은 2016년 공개되었습니다. 이전에는 코코아팟이나 카르타고와 같은 third-party도구를 이용했습니다.
기존에는 터미널에서 Package를 생성하였지만 2019년부터 Xcode에서 지원을 시작했습니다.
SwiftPM은 Swift 3.0 이상, Xcode 11 이상부터 포함되어 있습니다.
🔗 Swift Package Community 이 링크에서 다양한 용도의 패키지를 추천받을 수 있습니다.
🔗 Swift Package Index에서 원하는 패키지를 검색할 수 있습니다.
Swift Package 만들기
Swift 패키지를 만드는 것은 개인적인 용도로, 회사 내에서 개인적으로 사용하기 위해 코드를 모듈화하거나 나머지 Swift 커뮤니티가 사용할 수 있도록 오픈 소스 패키지를 릴리스하는 좋은 방법입니다.
추가 링크
- 🔗 Creating Swift Packages - WWDC 2019
- 🔗 Meet Swift Package plugins - WWDC 2022
- 🔗 add it to the Swift Package Index
- Swift 설치
# 명령어를 실행하여 설치여부를 확인합니다.
$ swift --version
2. SwiftPM을 사용하여 새로운 프로젝트를 생성
# 새로운 프로젝트 생성
$ swift package init --name <프로젝트명> --type <타입명>
- <프로젝트명>: 생성할 패키지의 이름을 입력합니다.
- <타입명>: 패키지의 타입을 지정합니다.
- library 또는 executable 중 하나를 선택할 수 있습니다. library는 다른 Swift코드로 가져올 수 있는 모듈이 포함되어 있고, executable은 운영체제에서 실행할 수 있는 프로그램입니다.
3. Sources/<프로젝트명>/<프로젝트명>.swift 초기소스파일에서 코드를 작성합니다.
4. Sources/<프로젝트명>Tests/<프로젝트명>Tests.swift 파일에서 테스트코드를 작성합니다.
5. 테스트 실행
# 명령어를 실행하여 테스트를 실행합니다.
$ swift test
6. Swift Pacakge Index에 추가
몇가지 요구사항을 충족하면 SPI에 추가할 수 있습니다.
- 패키지 저장소는 모두 공개적으로 접근가능해야 합니다.
- 패키지는 루트 폴더에 유효한 Package.swift 파일을 포함해야 합니다.
- 패키지는 Swift 5.0 이상으로 작성되어야 합니다.
- 패키지에는 버전 태그가 지정된 릴리스가 하나 이상 있어야 합니다.
- 최신 Swift 툴체인을 사용하여 swift package dump-package을 실행할 때 패키지는 모두 유효한 JSON을 출력해야 합니다.
- 패키지 URL에는 프로토콜(일반적으로 https )과 .git 확장자가 포함되어야 합니다.
- 패키지는 모두 오류 없이 컴파일되어야 합니다.
- 모든 패키지 내용물은 🔗 code of conduct을 준수해야 합니다.
요구사항을 충족하고 🔗 PackageList로 이동하여 Add Package 클릭
Swift Package 구조
.
├── Package.swift
├── Sources
│ └── MyLibrary
│ └── MyLibrary.swift
└── Tests
└── MyLibraryTests
└── MyLibraryTests.swift
Package.swift은 Swift의 매니페스트 파일입니다. 프로젝트의 메타데이터와 종속성을 보관하는 곳입니다.
Sources/MyLibrary/MyLibrary.swift은 라이브러리 초기 소스 파일이며 라이브러리 코드를 작성할 곳입니다. Test/MyLibraryTests/MyLibraryTests.swift은 라이브러리에 대한 테스트를 작성할 수 있는 곳입니다.
2️⃣ PackageCollection
Xcode 13이상부터 사용 가능한 Package Collection은 Swift Package URL 목록을 정의할 수 있는 API입니다.
Collection File은 일반적으로 HTTPS를 통해 가져오는 JSON 파일이고, 패키지 URL 목록과 (summary, product, versions, keyword, excludeProducts, readmeURL)등을 포함한 메타데이터가 포함되어 있습니다.
swift-package-collection-generator
🔗 swift-package-collection-generator 해당 Tool을 이용해서 Collection File을 생성할 수 있습니다.
해당 Tool은 메타데이터가 포함될 수 있는 패키지 URL목록이 작성된 입력 JSON파일을 가져와서 다른 사람들과 공유할 출력파일을 생성합니다.
해당 Tool은 각 패키지에 대한 정보를 자동으로 가져오지만 컬렉션을 작성할 때 패키지별로 추가 메타데이터를 제공할 수도 있습니다.
# 1. 저장소를 clone합니다.
$ git clone https://github.com/swiftlang/swift-package-collection-generator.git
$ cd swift-package-collection-generator
# 2. swift-package-collection-generator를 설치합니다.
$ swift build --configuration release
# 3. local에 명령어를 설치합니다.
$ install .build/release/package-collection-generate /usr/local/bin/package-collection-generate
$ install .build/release/package-collection-diff /usr/local/bin/package-collection-diff
$ install .build/release/package-collection-sign /usr/local/bin/package-collection-sign
$ install .build/release/package-collection-validate /usr/local/bin/package-collection-validate
입력JSON, 출력JSON 파일 생성방법
1. 입력 JSON 파일을 작성합니다.
- 🔗 v1 Format 해당 문서를 참고하여 원하는 값들을 입력합니다.
# [입력 JSON파일명]
{
"name": "Rx Collection",
"overview": "Rx 관련 패키지 모음",
"keywords": ["Rx"],
"formatVersion": "1.0",
"revision": 1,
"generatedAt": "2024-08-12T12:00:00Z",
"packages": [
{
"url": "https://github.com/ReactiveX/RxSwift.git",
"summary": "RxSwift",
"versions": [ "6.7.1" ]
}
]
}
2. collection-generator 툴을 사용하여 입력 JSON파일을 통해 출력 JSON파일을 생성합니다.
# 3-1. local에 설치가 완료되면 명령어를 실행할 수 있습니다.
$ package-collection-generate [입력 JSON파일명] [출력 JSON파일명]
# 3-2. local에 설치하지 않고도 clone한 저장소의 경로에서 실행할 수 있습니다.
$ swift run package-collection-generate [입력 JSON파일명] [출력 JSON파일명]
3. 출력된 JSON을 Package Collection에 추가합니다.
$ swift package-collection add [출력 JSON파일명] --trust-unsigned
PackageCollection 서명
서명을 추가하지 않고도 PackageCollection을 사용할 수 있습니다.
서명을 추가하면 해당 PackageCollection을 생성할 때 서명하는 작업입니다.
1. 🔗 Apple Developer - Certificates, Identifiers & Profiles로 이동 합니다.
2. Swift Package Collection Certificate을 생성합니다.
3. 다운로드 받은 Certificate를 추가한 후 키체인으로 이동하여 개인키를 내보냅니다.
4. openssl을 이용하여 .p12 -> .pem 파일로 변경합니다.
🚨 openssl이 3버전 이상이라면 legacy옵션을 활성화해야 합니다.
### openssl 1버전
$ openssl pkcs12 -nocerts -in swift_package.p12 -out swift_package.pem
### openssl 3버전이상 legacy 옵션활성화
$ openssl pkcs12 -nocerts -legacy -in swift_package.p12 -out swift_package.pem
### rsa 변경
$ openssl rsa -in swift_package.pem -out swift_package_rsa.pem
5. 🔗 Apple PKI로 이동하여 중간인증서(Wordwide Developer Relations - G3), 루트인증서(Apple Root CA - G3 Root)다운로드합니다.
6. swift-package-collection-generator에서 Sign을 적용합니다.
위의 package-collection-generator 명령어를 실행하여 입력 JSON을 출력 JSON파일명으로 변경 후 서명을 추가해줍니다.
$ swift run package-collection-sign [출력한 JSON파일명] [새로 생성할 JSON파일명] swift_package_rsa.pem swift_package.cer AppleWWDRCAG3.cer AppleRootCA-G3.cer
🔗 참고링크
Swift Package Manager 적용기 - tech.kakao.com
안녕하세요! 카페앱개발파트에서 iOS 개발을 하고 있는 셀린(Celine.jin)...
tech.kakao.com
'iOS > iOS (응용)' 카테고리의 다른 글
iOS 개발자가 알아야 할 JSON 처리 방법 (0) | 2025.03.02 |
---|---|
iOS 앱 배포 자동화: Slack 명령어로 TestFlight 업로드 (Flask, Bitbucket Pipelines, Fastlane 활용) (2) | 2024.06.03 |
Swift에서 다양한 방법으로 Endpoint 관리하기: URL Extension, Enum, Struct, Protocol 비교 (0) | 2024.04.19 |