Swift Package Manager

2021년 11월 19일 수정

SPM(Swift Package Manager)는 Swift를 위한 공식 패키지 관리 및 의존성 관리를 위한 공식 도구다. Cocoapods와 비슷하다고 볼 수도 있는데, 굳이 비교하자면 Carthage와 더 유사한 것 같다. 다만 공식 패키지 관리자라는 점이 특징인 것 같다. 다만 이제는 Xcode에서도 쉽게 관리할 수 있다는 큰 이점을 가지고 있다.

SPM 프로젝트 생성하기

아래 커맨드로 현재 디렉터리에 프로젝트를 생성할 수 있다.

swift package init

프로젝트 이름은 디렉토리 이름과 동일하게 생성된다. Sources/ProjectName/ProjectName.swift 라는 파일이 기본적으로 생성되는데 내용은 구조체 하나만 달랑 들어있다.

정확하게 이야기해서 위 커맨드는 라이브러리 프로젝트를 생성한다. 명확하게 말하자면 아래 커맨드가 라이브러리 프로젝트를 생성하는 정확한 명령이다.

swift package init --type library

사실상 위와 동일한 프로젝트가 생성된다. 명확한 것을 좋아하면 이 커맨드를 쓰는 게 좋을 것 같다.

만약 라이브러리가 아니라 실행 파일 프로젝트를 만들고 싶다면 아래와 같이 할 수 있다.

swift package init --type executable

생성되는 내용은 거의 동일하다. 단지 Sources/ProjectName/main.swift 라는 파일이 기본적으로 생성되고 내부에서는 Hello, world! 를 찍는 코드가 달랑 들어있다.

추가로 Xcode 프로젝트를 생성하고 싶다면 아래 커맨드를 사용할 수 있다.

swift package generate-xcodeproj

이 커맨드는 정말 projectName.xcodeproj 파일만 생성한다. 하지만 기존 UIKit 혹은 AppKit 프로젝트와는 다르게 뭔가 많이 빠진 썰렁한 프로젝트로 생성된다. 아마도 순수 Swift 프로젝트라서 그런 듯하다.

의존성 설정하기

의존성(Dependency)은 프로젝트 루트의 Packages.swift 라는 파일로 설정한다. 이 파일을 열어보면 dependencies 항목을 찾을 수 있다.

let package = Package(
  name: "ProjectName",
  dependencies: [
    .package(url: "foobar", from: "1.0.0")
    .package(url: "https://github.com/Alamofire/Alamofire.git",
             .upToNextMajor(from: "5.2.0"))
  ]
  // ...
)

이미 예제코드가 주석으로 쓰여져 있어서 작성하기는 쉽다. url 은 예제 처럼 디렉터리가 올 수도 있고 github 등의 URL이 올 수도 있다. from 필드로 표기하는 버전은 semver(Semantic Versioning) 표기법을 따르거나 위 처럼 다양한 옵션이 있다.

의존성 설치 및 업데이트 하기

아래 커맨드로 의존 패키지를 설치할 수 있다.

swift package update

필요하다면 업데이트도 진행된다.

체크아웃 되는 내용은 .build 디렉터리에 들어가서 파인더 등에서는 보이지 않을 수도 있다.

테스트, 빌드, 실행하기

테스트는 아래 커맨드로 수행할 수 있다.

swift test

디버그 빌드는 build 커맨드를 이용한다.

swift build

릴리즈 빌드는 릴리즈 설정을 별도로 사용한다.

swift build --configuration release

바로 실행하고 싶다면 run 커맨드를 이용해보자.

swift run

Xcode에서 의존성 설정하기

Xcode에서 기존 프로젝트에 의존성을 추가하려면 File - Swift Packages - Add Package Dependency 메뉴를 통해 쉽게 추가할 수 있다.