Tuist 로 외부 의존성 관리하기

Kanghoon
5 min readApr 14, 2022

--

오늘은 많은 분들이 질문해주셨던 Tuist 3.x 버전에서 변경된 외부 의존성 관리에 대해 알아보려고 합니다.

지원하는 외부 의존성

  1. SPM : Swift Package Manager 를 사용하는 의존성
  2. Tuist + Swift Package : Dependencies.swift 를 이용한 Swift Pakcage 의존성
  3. Tuist + Carthage : Dependencies.swift 를 이용한 Carthage 의존성
  4. Framework (xcframework) : Framework 를 사용한 의존성

자주 사용하는 의존성은 위와 같습니다. 하나씩 살펴보겠습니다.

1. SPM

SPM 을 직접 사용하는 방식입니다. (Xcode 에서 수동으로 다루는 것과 동일)

Tuist 3.x 버전 기준으로 deprecated warning 을 내고 있으나, 정석적인 방법이기 때문에 아직까지는 SPM 을 직접 사용하는 것이 가장 안전합니다.

Xcode 에서 SPM 을 사용했던 방법을 떠올리시면 쉽게 이해할 수 있습니다.

먼저 프로젝트에 package 를 등록합니다. 그리고 의존성이 필요한 타겟의 dependencies 에 package 의존성을 등록합니다.

tuist generate 를 실행하면 package 를 resolve 한 뒤 프로젝트가 생성됩니다.

결과물이 Xcode 에서 수동으로 SPM 을 추가한 프로젝트와 동일한 것을 확인할 수 있습니다.

2. Tuist + Swift Package

처음 보시는 분들은 왜 ‘Swift Package 가 두개지..?’ 라고 생각하실 것 같습니다.

이번에 다루는 것은 Tuist 의 Dependencies.swift 를 사용한 Swift Package 의존성 관리 방식입니다.

Tuist 에서 Package 를 resolve 한 뒤 별도의 framework 로 구성해주는 방식입니다. (Package 를 직접 사용하지 않아요)

MACH_O_TYPE 을 직접 설정할 수 있기 때문에 Swift Package 를 사용할 때 문제되었던 링킹 문제들을 해결할 수 있습니다. (RxSwift, RxTest 에러는 이제 안녕…)

예시와 함께 더 살펴보겠습니다.

먼저 Tuist 디렉토리에 Dependencies.swift 파일을 생성하고 tuist edit 을 실행합니다.

필요한 의존성을 정의한 뒤 몇가지 설정을 적용합니다.

위 예제의 경우 swizzling 을 위해 ReactorKitRuntime 을 dynamic 으로 변경하고, Alpha configuration 를 구성하였습니다.

configuration 의 경우 Tuist 3.0.x 버전에서 잘못 지정되는 문제가 있어 3.1 이상의 버전을 사용해야 합니다.

$ tuist fetch
$ tuist generate

이제 의존성을 받아오고, 프로젝트를 생성해봅시다.

SPM 을 사용했을 때와 다르게 framework 로 구성된 것을 확인할 수 있습니다. ReactorKitRuntime 은 dynamic 으로 구성된 것도 확인해볼 수 있습니다.

이 방식을 이용해 RxTest 에서 RxSwift 를 잘 찾지 못하는 문제도 해결할 수 있습니다.

$ tuist cache warm — dependencies-only

추가로, 위 명령어를 이용해 외부 의존성을 사전에 빌드해 캐시를 생성할 수 있습니다.

3. Tuist + Carthage

위와 마찬가지로 Tuist 의 Dependencies.swift 를 이용한 Carthage 의존성 관리 입니다.

큰 차이가 없어 바로 예제 코드를 살펴보겠습니다.

Dependencies.swift 파일에 Carthage 의존성을 추가하고 프로젝트를 생성하면 Swift Package 와 동일한 결과를 볼 수 있습니다.

에러가 발생한다면 Carthage 가 설치되어 있는지 확인해보세요

4. Framework (xcframework)

Framework 를 직접 참조하여 의존성을 추가하는 방식입니다.

이는 Target 에서 직접 추가할 수 있습니다.

마무리

Tuist 3.x 버전에서 변경된 Dependencies 에 대해서 알아보았습니다. 아직까지 Swift Package 의 경우 Dependencies.swift 를 사용할 때 정상 동작하지 않는 서드파티도 존재합니다. (header 관련, link 관련 이슈)

실제로 Tuist 가 Package 어떤 방식으로 Framework 로 변환하는지 확인해보시면 이해에 도움이 되실 것 같습니다.

의존성 관리 도구가 많아진만큼 그 동작에 대한 이해가 많이 필요해진 것 같습니다. 각 도구들의 동작과 장단점을 이해하고 적절한 것을 사용해보시면 좋을 것 같습니다.

궁금한 점이 있으시거나 도움이 필요한 분들은 댓글이나 메일 부탁드립니다.

email : ray@daangnpay.com

--

--