🔥 Package Dependency Requirement

476자
7분

Swift 패키지 매니저에는 Package.Dependency.Requirement라는 열거형이 있어요. 이걸 사용하면 패키지가 의존하는 다른 패키지의 버전 조건을 정할 수 있죠. 버전 조건은 크게 세 가지로 나눌 수 있습니다.

버전 기반 조건

프로젝트에서 사용하는 패키지를 다음 주(major) 버전이나 다음 부(minor) 버전까지 업데이트해도 괜찮은지 정하는 거예요. 더 엄격하게 관리하고 싶다면 특정 버전 범위나 정확한 버전을 지정할 수도 있죠. 보통 주 버전은 부 버전보다 변화가 크기 때문에, 주 버전이 올라가면 내 코드도 함께 수정해야 할 수 있어요. Swift 패키지는 의미론적 버전 규칙(Semantic Versioning)을 따르도록 되어 있답니다. 의미론적 버전 규칙이 뭔지 더 알고 싶다면 semver.org를 참고해 보세요.

패키지 의존성을 추가할 때는 버전 기반 조건을 사용하는 게 가장 좋아요. 이렇게 하면 패키지의 변경을 어느 정도 제한하면서도 개선 사항과 새로운 기능은 받아들일 수 있거든요.

예를 들어, 다음과 같이 정확한 버전을 요구할 수 있어요:

swift
.exact("1.2.3")  // 패키지의 1.2.3 버전을 사용합니다.
swift
.exact("1.2.3")  // 패키지의 1.2.3 버전을 사용합니다.

그런데 정확한 버전을 지정하는 건 별로 추천하지 않아요. 여러 패키지가 같은 패키지에 의존하고 있다면 버전 충돌이 일어날 수 있거든요. Swift 패키지는 의미론적 버전 규칙을 따르니까, 차라리 버전 범위를 지정하는 게 나을 거예요.

브랜치 기반 조건

패키지가 특정 브랜치를 따르도록 할 수도 있어요. 여러 패키지를 동시에 개발하거나, 패키지 버전을 따로 배포하고 싶지 않을 때 브랜치 기반 조건을 사용하면 좋죠.

단, 브랜치 기반 조건을 사용하는 패키지는 버전 기반 조건을 사용하는 다른 패키지에 의존성으로 추가될 수 없어요. 패키지 버전을 배포하기 전에는 꼭 브랜치 기반 조건을 제거해야 합니다.

브랜치 기반 조건은 이렇게 사용해요:

swift
.branch("develop")  // develop 브랜치의 모든 변경 사항을 받아들입니다.
swift
.branch("develop")  // develop 브랜치의 모든 변경 사항을 받아들입니다.

커밋 기반 조건

패키지가 특정 커밋을 따르도록 할 수도 있어요. 그런데 이 방법은 별로 추천하지 않아요. 정말 특별한 경우에만 사용하는 게 좋죠. 패키지를 특정 커밋에 고정하면 패키지 내용이 바뀌지 않으니 안정적이기는 하지만, 새로운 업데이트를 전혀 받을 수 없게 돼요. 원격 패키지가 불안정해서 걱정된다면 차라리 버전 기반 조건 중에서 조금 더 엄격한 걸 고르는 게 나을 거예요.

커밋 기반 조건을 사용하는 패키지도 버전 기반 조건을 사용하는 다른 패키지에 의존성으로 추가될 수 없어요. 패키지 버전을 배포하기 전에는 꼭 커밋 기반 조건을 제거해야 해요.

커밋 기반 조건은 이렇게 사용합니다:

swift
.revision("e74b07278b926c9ec6f9643455ea00d1ce04a021")  // 특정 커밋에 대한 버전 조건을 정의합니다.
swift
.revision("e74b07278b926c9ec6f9643455ea00d1ce04a021")  // 특정 커밋에 대한 버전 조건을 정의합니다.

메서드

Package.Dependency.Requirement 열거형에는 여러 가지 버전 조건을 만들 수 있는 메서드들이 있어요. 각 메서드는 해당하는 조건의 인스턴스를 반환하죠.

exact(_:)

정확한 버전을 요구하는 조건을 만듭니다.

swift
static func exact(_ version: Version) -> Package.Dependency.Requirement
swift
static func exact(_ version: Version) -> Package.Dependency.Requirement

revision(_:)

특정 커밋을 요구하는 조건을 만듭니다.

swift
static func revision(_ ref: String) -> Package.Dependency.Requirement
swift
static func revision(_ ref: String) -> Package.Dependency.Requirement

branch(_:)

특정 브랜치를 요구하는 조건을 만듭니다.

swift
static func branch(_ name: String) -> Package.Dependency.Requirement
swift
static func branch(_ name: String) -> Package.Dependency.Requirement

upToNextMajor(from:)

지정한 버전부터 시작해서 다음 주 버전 직전까지를 허용하는 조건을 만듭니다. 버전 조건으로는 이걸 쓰는 게 가장 좋아요.

swift
static func upToNextMajor(from version: Version) -> Package.Dependency.Requirement
swift
static func upToNextMajor(from version: Version) -> Package.Dependency.Requirement

upToNextMinor(from:)

지정한 버전부터 시작해서 다음 부 버전 직전까지를 허용하는 조건을 만듭니다.

swift
static func upToNextMinor(from version: Version) -> Package.Dependency.Requirement
swift
static func upToNextMinor(from version: Version) -> Package.Dependency.Requirement

이 메서드들을 사용하면 패키지 의존성에 대해 다양한 조건을 유연하게 설정할 수 있어요. 프로젝트의 안정성과 업데이트 가능성을 잘 조율할 수 있도록, 상황에 맞는 적절한 의존성 조건을 선택하는 게 중요하답니다.

YouTube 영상

채널 보기
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
C++ 속의 펑터 | 프로그래머를 위한 카테고리 이론
NestJS 가드, 바이딩과 스코프 | NestJS 가이드
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
존 매카시가 들려주는 인공지능의 탄생 이야기
class-validator 와 DTO | NestJS 가이드
매번 ValidationPipe 복붙하세요? NestJS 전역 파이프로 한 번에 해결하기 | NestJS 가이드
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드