상세 컨텐츠

본문 제목

Swift Package Dependencies는 누가 들고 있는 걸까

실험실

by box-jeon 2021. 5. 9. 01:35

본문

SPM을 이용해 Local Package를 추가하다가 의문이 생겨서... 확인한 것들을 메모해보았습니다.

 

일단 프로젝트에 Swift Package를 추가하려면...

File -> Swift Package -> Add Package Dependency 선택하거나

혹은 프로젝트 선택 후, 'Swift Packages'탭에서 + 를 누르게 됩니다.

이렇게 추가된 Swift Package들은 Xcode 좌측의 Project Navigator 맨 마지막에 Swift Package Dependencies 항목 밑에 나타납니다.

 

여기까지는 자연스러운데;;;

이제 Local Package에서 Package.swift를 이용해 dependency를 명시할 경우, Local Package의 dependency로 추가된 Swift Package들도 Project Navigator 하단에 함께 보여집니다. 더 정확히 이야기하면 Proeject에 직접 추가하거나 Local Swift Package의 dependency에 의해 추가된 Swift Package의 합집합이 Project Navigator에 표시됩니다.

 

설명을 위해 Local Package의 이름이 LocalLib, Project의 이름이 TargetApp이라고 하겠습니다. 명시한 dependency는 다음과 같습니다.

LocalLib
    ㄴ KakaoSDKWrapper
        ㄴ KakaoSDKCommon
            ㄴ Alamofire
    ㄴ RxSwift
        ㄴ RxSwift
TargetApp
    ㄴ LocalLib

그리고 프로젝트 모양새

 

의문 1. TargetApp은 KakaoSDKWrapper나 Alamofire를 import할 수 있는가?

됩니다.

잘 이해가 안되지만;;; TargetApp의 Swift Packages에 명시적으로 추가하지 않았어도, 명시적으로 표시한 package(LocalLib)의 dependency에 걸려있으면 TargetApp이 import할 수 있습니다. Alamofire를 직접 추가한 적은 없지만 LocalLib도 TargetApp도 import할 수 있습니다.

 

의문 2. 그럼 TargetApp은 RxCocoa를 import 할 수 있는가?

안됩니다.

애매한 부분은 RxSwift와 같이 하나의 repo가 복수의 라이브러리를 제공하는 경우입니다.

RxSwift를 TargetApp에 직접 추가할 경우

복수의 라이브러리 중 일부만 선택한 경우에도 Project Navigator의 Swift Package Dependencies는 해당 repo에 있는 모든 파일을 표시합니다. 결국 Project Navigator에 RxSwfit/RxCocoa가 보인다고 해도, 실제로 RxCocoa를 import할 수 있는지는 코드를 쳐서 빌드를 돌려봐야 확인할 수 있습니다. 

 

혼란 3. LocalLib은 RxSwift만 있으면 되는데, TargetApp은 RxCocoa도 필요하다고 하면 어떻게 하는 게 좋을까.

LocalLib이 사용하지도 않을 RxCocoa를 추가해야하는지, TargetApp에서 RxSwift를 다시 추가해야하는지.

뭔가 개운하지 않은 느낌이 들지만... LocalLib이나 TargetApp의 Swift Package Dependency가 중복되더라도 알아서 잘 처리하는 것 같습니다. 동일한 Swift Package이지만 서로 다른 버전을 import한 경우에는 아예 빌드가 안됩니다. 결국 전체 프로젝트에서 누가 어떤 Swift Package를 import하는지 의식하지 말고, 해당 타겟이 필요로 하는 Swift Package만 dependency에 걸어야할 것 같습니다.

 

TMI 4. RxSwift/RxSwift만 import했다면 빌드도 딱 그것만 되는가.

그렇습니다.

명확히 하고 싶어서... 복수의 라이브러리를 가진 Swift Package를 생성해서, 라이브러리 하나에 컴파일 에러를 심어봤습니다.

 

실수담 5. 내가 작성한 Swift Package를 import 했는데... 왜 scheme이 막 일괄로 추가되는가...

이게 대체 무슨 짓인가

Swift Package의 근사한 점 중에 하나는 프로젝트 파일이 따로 없다는 점입니다. Package.swift와 디렉토리를 훑어서 처리하는 것 같은데, 재미있는 부분은 'Manage Schemes' 메뉴를 통해서 scheme들을 몽땅 지워봐도 실제로 지워지는 파일이 없고, Xcode를 재실행하거나 Package Resolve를 하면 scheme들이 다시 생성됩니다.

실험 도중에 실수로 scheme 파일들을 실제로 생성해 repo에 포함시키는 상황이 발생했는데, 이 경우 해당 Swift Package를 import한 프로젝트에 scheme이 모두 추가됩니다.

 

마무리

약간 결벽증 느낌으로 Local Swift Package와 프로젝트의 Depencency Tree가 어떻게 나오는지 알아보고 싶었는데... 애초에 잘못된 접근이었던 것 같습니다. 특정 타겟의 dependency가 전체 프로젝트 레벨에서 다른 쪽과 중첩되는 문제는 굳이 신경쓰지 말고, 필요한 것들을 각자 지정하는 것에만 집중하면 되는 듯 합니다.

'실험실' 카테고리의 다른 글

Swift Package Name에 관한 이야기  (0) 2021.07.10
맥북에어(2020) vs 맥북프로(2019)  (0) 2021.02.08

관련글 더보기

댓글 영역