티스토리 뷰

공부

Carthage

Zedd0202 2021. 4. 15. 11:15
반응형

 

안녕하세요 :) Zedd입니다.

저는 개인 & 회사 모두 CocoaPods만 사용해서..Carthage를 제대로 사용해본적이 없어요.

Carthage에 대해서도 공부를 해놓아야 할 것 같아서!!! 

 

# Dependency Manager

보통 어떤 개발자가 이미 작성한 코드를 재사용하는 것이 일반적인데요,

이렇게 기존에 짜여진 코드를 활용하면 개발 시간을 크게 단축하고 비용을 줄일 수 있습니다.

이런 코드들을 내 프로젝트에 가져오는 것은 내 프로젝트에 Dependency(종속성)를 가지게 되며, 

내 프로젝트의 Dependency들을 관리해주는 도구가 Dependency Manager라고 보면 될 것 같아요.

(틀린 설명이 있다면 댓글로 알려주세요 ㅠ)

 

iOS에서 인기있는 Dependency Manager로는

CocoaPods

Carthage

Swift Package Manager

이정도가 있을 것 같습니다. 

 

# Carthage

저는 그 중에서도 Carthage를 공부해볼건데요. (발음은 카르타고,카르타지 등...으로 발음하면 됨)

Carthage는 

- Dependency Manager

- 바이너리 프레임워크 제공.

- 프로젝트 파일이나 빌드설정을 자동으로 수정하지 않음. 

과 같은 특징을 가지고 있습니다. 

 

잠깐 CocoaPods이야기를 해야할 것 같은데요.

https://adinugroho.medium.com/when-to-use-cocoapods-when-to-use-carthage-a8757ff93b51

CocoaPods의 빌드 과정입니다. 

CocoaPods은 centralized dependency manager이며

.xcworkspace을 생성하여 dependency를 빌드하고, 프로젝트에 자동으로 직접 통합합니다.

즉, 빌드 직후에 dependency에 접근할 수 있게 됩니다. 

 

Carthage는 CocoaPods의 빌드 과정과는 조금 다릅니다.

https://adinugroho.medium.com/when-to-use-cocoapods-when-to-use-carthage-a8757ff93b51

CocoaPods이 centralized dependency manager라면,

Carthage는 decentralized dependency manager입니다.

프로젝트에 직접 통합하는 작업은 하지 않고,

Cartfile에 지정된 프레임워크를 빌드하고 이를 Carthage/Builds 폴더로 이동시킵니다.

(이 과정에서 한번 빌드 하기 때문에, CocoaPods때와는 다르게 Xcode는 다시 빌드하는 과정을 거치지 않습니다.) 

또한 빌드 프로세스 후 dependency를 통합하고 관리하는 것은 개발자에게 달려있습니다. 

 

 

🙋 : CocoaPods이 centralized dependency manager라면, Carthage는 decentralized dependency manager입니다?

🧑‍💻 :

[Centralized dependency manager] 

프레임워크나 라이브러리를 찾고 다운로드 하기 위한 single source of truth가 있는 것을 의미합니다. 

CocoaPods은 Github에 모든 Pod의 Podsepc을 저장한 Specs라는 single 저장소가 있기 때문에

centralized dependency manager라고 할 수 있습니다.

즉, CocoaPods에서 프레임워크나 라이브러리를 지원하는지 확인하고 싶으면, CocoaPods웹사이트에서 검색만 하면 되는 것이죠. → 개발자가 프레임워크/라이브러리를 더 쉽게 찾을 수 있음. 

 

[Decentralized dependency manager]

반면에 Carthage는 종속성을 찾기 위한 single 저장소가 없고, 분산되어있기 때문에 decentralized dependency manager입니다.

그러므로 CocoaPods에 비해 프레임워크/라이브러리 검색이 더 어렵습니다.

사용자는 Github Trending 페이지같은 것에 의존해야하는 것이죠. 

 

🙋 : CocoaPods은 dependency를 자동으로 프로젝트에 직접 통합합니다. / Carthage는 dependency를 통합하고 관리하는 것은 사용자에게 달려있습니다?

🙋 : CocoaPods을 사용하고 개발자가 pod install을 실행하면 CocoaPods은 자동으로 다음을 실행합니다.

1. Xcode workspace 생성

2. 종속성들의 버전이 명시된 Podfile.lock파일 추가 

3. 타켓의 build phase에 스크립트 추가.

4. Link Binaries With Libraries에 프레임워크 연결 

5. 종속성들, supporting files, xconfig 파일의 소스코드를 저장하는 Pods 디렉토리를 만듬.

이 모든것을 자동으로 해줍니다.

 

반면에 Carthage는 바이너리 프레임워크를 다운로드 & 빌드까지만 하고 다른 모든 작업은 개발자에게 맡겨집니다.

CocoaPods에 비해 시간이 많이 소요되겠지만, 종속성이 프로젝트에 통합되는 방식을 정확하게 제어 할 수 있는 장점이 있습니다.

 

CococaPods : 사용하기 쉬움

Carthage : 유연하고 unintrusive하다 (unintrusive : 방해받지 않는. Carthage문서에서 말하고 있음. 여기 참고)

 

🙋 : 이렇게 보면 CocoaPods이 짱인것 같은데.. 

🧑‍💻 : 프로젝트에 맞는 Dependency Manager를 선택하면 됩니다. 또는 CocoaPods과 Carthage를 같이 쓸 수도 있겠구요.

CocoaPods은 프로젝트를 빌드 할 때 모든 종속성을 빌드합니다.

또한, 클린빌드 or 아카이브할 때 마다 모두 다시 빌드해야하므로 프로젝트 빌드시간이 현저히 느려질 수 있습니다.

반면에 Carthage는 미리 빌드된 프레임워크를 사용하기 때문에 CocoaPods에 비해 빌드 속도가 빠릅니다. 

CocoaPods / Carthage

Xcode에서 빌드할 때 클린빌드든 뭐든 내 종속성들을 다시 빌드하지 않는다는 거죠. 

하지만 Carthage 사진에서 볼 수 있듯이, 이 "미리 빌드"해 놓기 위해서는 일단 빌드를 해야하잖아요?

이 작업이 오래걸릴 수 있습니다. 이 부분은 Carthage 캐싱 도구인 Rome으로 해결이 가능하다고 합니다.

관련 글은 

 

Carthage + Rome으로 빌드 시간 줄이기

Carthage + Rome으로 빌드 시간 줄이기

pilgwon.github.io

를 참고하면 좋을 것 같습니다. 

 

위에서 전부 설명한 것 같지만..Carthage가 말하는 'Differences between Carthage and CocoaPods'도 읽어보면 좋을 것 같습니다. 

글에 틀린 설명이 있으면 댓글로 알려주세요!!

 


Carthage를 공부해봤는데, 다음글에서 본격적인 사용방법에 대해서 공부해볼게요!! 

다음글 읽으러가기 : Carthage 사용해보기 

 

참고로 빌드 시간 개선이 필요하다..!!싶으신 분들은

Diagnostic options을 적용해보는 것도 나쁘지 않을 것 같아요~ 

Xcode 11.5기준
클린 빌드 속도는 약 26% 빨라졌습니다! (빌드 시간이 줄었다는 뜻)

Xcode 12 beta 4 기준
클린 빌드 속도는 약 20% 빨라졌습니다! (빌드 시간이 줄었다는 뜻)

저는 Diagnostic options을 적용 및 리팩토링 후 위와 같은 빌드 시간 개선을 얻을 수 있었습니다! 

 

참고 

blog.embrace.io/should-you-use-cocoapods-or-carthage/

adinugroho.medium.com/when-to-use-cocoapods-when-to-use-carthage-a8757ff93b51

github.com/Carthage/Carthage

반응형

'공부' 카테고리의 다른 글

PinLayout 사용해보기  (0) 2021.04.21
Carthage 사용해보기  (0) 2021.04.17
Swift ) Quick / Nimble 간단하게 사용해보기  (0) 2021.04.14
Diffable Datasource - supplied item identifiers are not unique  (1) 2021.04.12
Diffable Datasource  (3) 2021.04.06