Swift Package Manager(SPM)를 이용해서 라이브러리 만들기 Step By Step

Swift Package Manager를 이용해서 내가 만든 소스코드를 라이브러리 형태로 배포하는 과정을 설명하려고 한다.
여러 유명 라이브러리 (Alamofire, Snapkit, RxSwift, Kingfisher, SDWebImage..)들도 SPM를 이용해서 배포를 하고 있다.
이 글에서는 Xcode15.2를 기준으로 작성 되었다.
 

Xcode 실행

1. Launchpad 선택
2. Xcode 실행
 
 

Package 메뉴 선택

1. Xcode가 실행되면 모니터 왼쪽 최상단 File 메뉴를 선택
2. New 메뉴 선택
3. Package 메뉴 선택
 
 

Package 생성단계

1. Multiplatform 메뉴 선택
2. Library 선택
3. Next 선택
 
 

1. 패키지 이름을 작성
2. Source Control 생성 유무. Github에 해당 라이브러리를 올려서 배포해야 하므로 체크 표시하자
3. Create 버튼 선택
 
 

생성된 패키지

생성이 완료되면, 왼쪽 네비게이션 메뉴에 해당 파일 리스트가 나타난다.
 
1. Package.swift:
Swift Package를 관리할 때 핵심적인 역할을 하는 파일. 패키지의 구성을 설명하며, 프로젝트의 의존성과 구조를 정의하는 데 사용.
 
2. Sources 디렉토리:
패키지의 모든 실행 가능한 코드를 포함됨. 테스트 코드는 제외하고, 실제로 패키지의 기능을 구현하는 코드만 포함.
각 타겟에 대해 별도의 서브 디렉토리를 가진다. 예를 들어, SPMExample라는 타겟이 있다면, Sources/SPMExample 디렉토리 안에 해당 타겟의 소스 코드가 위치한다.
Swift Package Manager는 이 디렉토리를 통해 각 타겟의 소스 코드를 찾고, 빌드 프로세스 중에 이 코드를 컴파일한다.
 
3. Tests 디렉토리:
패키지의 테스트 코드를 포함하고 있다. 패키지가 의도한 대로 정확히 작동하는지 확인하는 데 필수적인 단위 테스트, 통합 테스트 등을 포함한다. Sources에서 구현된 소스코드를 검증하기 위해 꼭 구현하도록 하자.
 
 

Package.swift 구체적인 설명 (Alamofire 라이브러리의 Package.swift를 기준으로 정리했다.)

Alamofire's Package.swift

1. 패키지 설명을 위한 SwiftPM의 API를 사용할 수 있음.
 
2. Package + name:
패키지 객체를 생성 및 패키지의 이름을 정의. 여기서는 "Alamofire"가 패키지 이름.

3. platforms:
패키지가 지원하는 플랫폼과 각 플랫폼의 최소 버전을 명시. 위 예시에서 .macOS(.v10_13)은 macOS 10.13 이상에서 Alamofire가 지원됨을 의미.

3. products:
패키지가 제공하는 제품을 정의한다. 여기서는 두 가지 라이브러리가 정의되어 있다.
Alamofire: 정적 라이브러리로, targets에서 정의된 Alamofire 타겟을 포함.
AlamofireDynamic: 동적 라이브러리로, 같은 Alamofire 타겟을 포함하지만, 타입이 .dynamic으로 명시되어 있다.

4. targets:
패키지의 타겟을 정의한다. 타겟은 빌드의 기본 단위로, 소스 코드, 의존성 등을 포함.

 
4.1 ".target":
일반 타겟으로, 여기서는 Alamofire라는 이름의 타겟이 정의되어 있음. path는 소스 파일이 위치한 디렉토리를 지정하고, exclude는 빌드에서 제외할 파일을 지정한다. resources는 처리해야 하는 리소스를 명시하며, linkerSettings는 특정 플랫폼에서 필요한 추가 링커 설정을 제공한다.

4.2 ".testTarget":
테스트 타겟으로, 여기서는 AlamofireTests라는 이름의 타겟이 정의되어 있음.
이 타겟은 Alamofire에 대한 의존성을 가지며, 테스트 파일이 위치한 경로와 빌드에서 제외할 파일, 처리할 리소스를 지정한다.

5. swiftLanguageVersions:
패키지가 지원하는 Swift 언어 버전을 명시한다. 여기서는 Swift 5를 사용.
 
 

Sources 디렉토리의 구체적인 예시

Sources 예제

1. Swift 파일을 생성.
2. 클래스, enum, struct를 생성. 위 예시에서는 덧셈과 뺄셈을 할 수 있는 Calculator란 구조체를 정의함.
 
 

Tests 디렉토리의 구체적인 예시

1. 'test' 입력
2. Unit Test Case Class를 선택
3. Next 선택
 

파일 이름 설정 및 생성

1. 테스트 클래스의 이름 작성
2. Next를 선택
 

테스트 코드 예시

1. 생성된 테스트 클래스 파일.
2. 테스트 대상인 모듈에 접근할 수 있다
3. Calculator의 덧셈 기능을 테스트
4. Calculator의 뺄셈 기능을 테스트
 

제작한 Package를 Github을 통해 배포하기

Git Commit

(다른 Source Control IDE를 이용하면 아래 내용 패스)
1. 왼쪽 네비게이션에서 2번째 메뉴를 선택
2. Uncommitted Changes를 선택.
3. All Changes를 선택
4. Stage All 선택
5. 변경내역을 작성.
6. Commit을 선택.
 

Github 저장소 설정중

 
XCode에 Github 계정하기 (이미 해놨으면 아래로 패스)

Github 계정 설정

1. Xcode에서 Command + , 를 눌러 메뉴를 노출시키고 Accounts메뉴로 진입 후 '+'선택
2. Github 선택
3. Github에서 가이드 하는대로 Token을 생성
4. 계정과 생성한 Token을 붙여넣는다.
5. 로그인
6 ~ 7. 로그인이 성공적으로 되면 해당 메뉴처럼 나타난다
 
Github 저장소에 업로드하기 (Remote 저장소가 있다면 아래로 패스)

1. 해당 라이브러리의 설명을 적는다.
2. Create 버튼 선택
 
Github에 이미 저장소가 있다면:

1. 해당 Github 저장소 주소를 작성한다.
2. Add 버튼 선택
 
 

생성된 github remote 저장소
상세 페이지

 
위 과정을 잘 따라왔다면 github페이지에 접속해보자.
위 처럼 생성이 잘 되어있다.
 
내 프로젝트에 Swift Package 추가하기
자세한 내용은 여기를 참고하자 -> 출처: https://leviblog.tistory.com/33

1. 원격 저장소 주소 작성
2. 내 라이브러리 선택
3. 패키지 추가.
 

내 프로젝트

테스트 코드에서 작성했던과 마찬가지로 내 프로젝트에서도 잘 적용되는 모습을 볼 수 있다.