brunch

You can make anything
by writing

C.S.Lewis

by Tilltue Nov 18. 2019

Swift Package Manager를 적용하며

cocoapods, carthage, spm

* 이글은 XCode 11.2.1 , Swift 5.1.2 에서의 환경을 기준으로 작성했습니다.

* 이 글은 Swift Package Manager ( 이하 SPM ) 을 설명하는 글은 아닙니다.




SPM을 프로젝트에 적용하면서 발생했던 문제점들에 대해 공유하고자 한다.

먼저 왜 SPM을 사용하고자 했는지 정리해봤다.

- Catalyst 를 사용해서 mac 개발 ( and iPad ) 을 계획.

- carthage 는 catalyst 빌드를 지원하지 않고 있음. SPM을 사용하면 깔끔하게 정리됨.

- 기본적으로 SPM으로 적용하되, 문제가 있는 라이브러리들은 carthage로 사용하려함.



1. 오픈소스들중 다수가  Swift Package Manager 를 지원하지는 않는다.


Alamofire , Kingfisher, RxSwift 등 유명 오픈소스들은 완벽하게 SPM을 지원한다.

하지만 오픈소스의 다수는 아직 지원하지 않고 있으며, 이럴경우 지원이 가능하도록 작업이 필요하다.


오픈소스 fork -> Package.swift 구성 -> github 에 release 생성 -> SPM 에서 사용가능. ( fork repo url )

( 다른 프레임워크에 의존성을 가진 프레임워크라면 해당 프레임워크가 SPM을 지원해야 한다. )


소스코드가 분량이 적고, 특별한 문제점이 없다면 어렵지는 않다.


하지만 문제는 대걔의 경우 심플하지는 않다는것.


2. Swift Package Manager 의 알려진 문제.


내가 가진 오픈소스는 bundle resource를 가지고 있는데 SPM 에서는 번들을 추가하는 방법을 찾을수가 없었 다. 찾아낸 관련 이슈이다.

https://bugs.swift.org/browse/SR-2866

아직 bundle resource 를 추가를 지원하지 않고 있으며 스레드에서 몇가지 방법에 대한 의견 교환들이 진행중이다.


firebase 에서 SPM에서 지원을 위한 이슈를 찾았는데 정리된 내용이 있어 발췌했다.

https://github.com/firebase/firebase-ios-sdk/issues/3136


Binary library support

일부 firebase 라이브러리는 오픈소스가 아닌데, 바이너리 라이브러리 지원이 필요하다는것.

Swift 포럼에 토론이 있는 중인듯.


Resource support

위에 정리한 내용처럼 리소스 추가를 위한 지원이 필요.


Separately versioned libraries per repo

하나의 레포지토리 내에서 여러 라이브러리 버전을 지원. ( 이건 되는줄 알았는데? 음... 이상하다 )


Build Settings

빌드 세부 설정에 대한 지원이 필요하다.

( 아래에서 언급될 build configuration 등 )


이외

Module Map Generation

Subspec support

Private header


3. 몇몇 문제 해결방법


- Build configuration 관련 대표적인 문제로 Release / Debug Scheme 이외에 빌드가 되지 않는다는 문제가 있다. ( 이외 Scheme는 기본적으로 Release Path에 빌드됨 )


https://forums.swift.org/t/swift-package-manager-and-custom-build-configurations/29181

https://forums.swift.org/t/custom-build-configuration-names/29167/5

문제 관련 포럼의 글들


https://stackoverflow.com/questions/57165778/getting-no-such-module-error-when-importing-a-swift-package-manager-dependency/58307605#58307605

임시 해결방안에 대한 stackoverflow 에 제안된 방법


임시 해결방법의 경우 아래 스크립트를 컴파일 소스 이전에 수행하도록 하는 방법인데,

cp 를 통해 custom scheme 의 폴더에 release scheme 에 있는 파일들을 복사해버린다.


사용하는 프레임워크가 많다면 복사를 하는데 걸리는 시간도 만만치 않을터...

( 사실 스크립트 내용도 보지 않고 되길래 쓰려고 했는데 ... 동료개발자가 날카롭게 지적해주셨다. -_-b )


빌드 스크립트를 좀 손봤다.


custom scheme 디렉토리를 삭제하고, Release 디렉토리를 ln -s 를 통해 custom scheme 디렉토리 이름으로 링크 패스를 만들어 버리는 것.

원래는 디렉토리는 그대로 두고 안쪽에 파일들을 모두 링킹 하려고 했는데 빌드는 성공했는데, 앱 실행이 안되서... =ㅁ= 포기했다.


위 해결방법은 Swift 에서 문제를 해결해주기 전까지의 임시방편이다.




아직 SPM만으로는 완전하지 않은 것이 사실이다.


하지만 SPM은 다른 cocoapods, carthage 에 비해 정말 엄청나게 편하고 쉽게 프레임워크를 추가할수 있기때문에 앞으로 이런 문제들이 잘 수정되고 지원되서 하루빨리 SPM으로 갈아탈수 있게 되었으면 좋겠다. :)


마침.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari