Swift Package 만들기
1. 프로젝트 생성
Xcode > File > New > Package 를 선택하여 Swift Package 프로젝트를 만들자
Library를 선택하여 생성하면 아래와 같이 프로젝트가 생성된다.
2. 프로젝트 구조
Package 파일과 Sources폴더 Tests 폴더로 나뉘게 된다
3. Package
package파일은 패키지 이름, 외부 의존성과 같은 package에 대한 정보를 가지고 있다.
import PackageDescription
let package = Package(
name: "MyLibrary",
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]
)
],
dependencies: [
// 외부 라이브러리 추가
],
targets: [
.target(
name: "MyLibrary"),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
]
)
3-1. 외부 라이브러리 추가
만약 내가 만들 package에 외부 라이브러리를 추가하고 싶으면 dependencies에 추가해주면 된다.
외부라이브러리는 package전체에 추가할수도 있고 target별로도 추가할 수 있다.
아래는 package전체에 추가하는 방법이다. target별로도 추가하는 방법은 3-2에서 설명한다.
import PackageDescription
let package = Package(
name: "MyLibrary",
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]
)
],
dependencies: [
.package(url: "<https://github.com/ReactiveX/RxSwift.git>", .upToNextMajor(from: "6.0.0"))
],
targets: [
.target(
name: "MyLibrary"),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
]
)
외부 라이브러리를 추가하면 Xcode에서 자동으로 외부 라이브러리를 추가해준다
3-2 모듈 분리하기
같은 package 내에서도 여러모듈로 나눌 수 있다.
Sources 안에 별도 모듈을 위한 폴더와 코드가 있어야 한다.
또한 각 target마다 외부라이브러리를 추가도 가능하다.
MyLibrary1, MyLibrary2를 각각의 모듈로 나누었고 MyLibrary1에는 의존성을 추가해주었다.
// MyLibrary1
.target(
name: "MyLibrary1",
dependencies: [
.product(name: "RxSwift", package: "rxswift")
]
),
MyLibrary1의 dependencies의 .product에의 name은 원하는 이름을
package는 의존성을 추가하고싶은 package의 identity를 넣어준다.
3-3. 분리한 모듈 정의하기
target을 분리했더라도 바로 사용가능한것은 아니다.
target을 product의 library 타입으로 정의를 해줘야 사용자가 사용 가능하다.
// swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "MyLibrary",
products: [
.library(name: "MyLibrary", targets: ["MyLibrary"]),
// MyLibrary1이란 이름으로 라이브러리를 만들어주고 MyLibrary1과 MyLibrary2를 포함하게 만들어주었다.
.library(name: "MyLibrary1", targets: ["MyLibrary1", "MyLibrary2"])
],
dependencies: [
.package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.0.0"))
],
targets: [
.target(name: "MyLibrary"),
.target(
name: "MyLibrary1",
dependencies: [.product(name: "RxSwift", package: "rxswift")]
),
.target(name: "MyLibrary2"),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]
)
]
)
이런식으로 기능별로 분리하여 여러개의 product를 만들어서 배포하면 사용자가 패키지를 설치할 때 자신이 필요한 모듈만 선택하여 설치할 수 있다.
아래는 RxSwift의 예시이다.
위에 products의 library로 나누어진것을 확인 할 수 있다.
4. 배포하기
위와같이 패키지를 만들었으면 github에 추가하고 배포해주면 끝이난다.
readme를 추가하지 않고 gitIgnore과 license모두 none으로 선택하고 레포를 만든뒤
만들어둔 패키지를 git repo에 push 해준다
그 다음 gitrepo의 주소를 복사해서 spm에 입력해주면 끝 !