제목은 거창하지만 그냥 CocoaPod의 코드가 아닌 뒷단에서의 동작이 궁금해서 쓰게 된 글이다. 사용법은 도큐먼트 보면 되니까.
CocoaPod은 한마디로 중앙화(centralised)된 의존성 관리도구다. 개발자는 프로젝트의 종속성과 프레임워크 버전을 파악 및 관리하기 위해 Podfile을 사용한다. Pod 프로젝트는 .xcworkspace
에 생성되며 CocoaPods은 이를 통해 implicit dependency를 구현한다.
CocoaPod은 이를 실제 어떻게 관리, 구현하고 있을까?
일단 프레임워크 제작자는 podspec
이라는 파일을 반드시 구현하게 되어있다(문서). 이 파일은 종속성, subspec과 같은 프레임워크에 대한 메타 정보를 포함한다. podspec
의 가장 중요한 부분은 소스가 호스팅되는 위치를 CocoaPod에 알려주는 부분인 source
이며 이 위치에 존재하는 소스코드가 Pod 프로젝트로 다운로드 된다.
CocoaPod은 workspace를 사용하여 빌드 프로세스를 자동화하고 implicit dependency를 구현한다고 말했다. 이를 통해 개발자는 필요한 모든 소스를 프로젝트에 가져오고 프로젝트를 빌드할 때 Xcode는 Pod에서 필요한 소스를 같이 컴파일 한다.
그렇다면 CocoaPod이 갖는 장점은 뭘까? 편리하다는 것 외에 중앙화된 관리방법에서 몇가지 이점을 찾을 수가 있다.
podspec
파일의 dependency
라는 항목에 주목해보자. 이를 통해 개발자는 우리의 프레임워크가 다른 프레임워크에 종속된다는 것을 알릴 수 있다. 그렇다면 개발자가 직접 종속된 소스를 넣어줘야 하는 것인가? 다행히도 CocoaPod은 개발자가 그런 수고를 할 필요 없이 중앙화의 힘으로 해당 프레임워크를 찾아 넣어준다.
그렇다면 수많은 Pod들은 어디에 저장되어 관리되고 있는 것일까. 일종의 클라우드처럼 중앙화된 서버가 이를 관리하고 있을 것 같지만 사실 우리가 사용할 수 있는 Pod들, 정확히 말하면 Pod들의 목록은 github의 Spec라는 저장소에서 관리되고 있다.
CocoaPod 블로그에 따르면(링크) 과거에 Pod을 등록하기 위해선 CocoaPod/Spec
레포에 PR을 날려야 했고 이를 레포 마스터들이 하나하나 리뷰했다고 한다. 하지만 규모가 커짐에 따라 인력으로 PR들을 머지하는 것은 곧 불가능해졌고 그 결과 배포를 해봤다면 한번쯤은 들어봤을 Trunk 웹서비스(aka. pod trunk push
)라는 CLI툴이 등장하게 된 것이다.
PodSpec
은 이를 가능하게 해준 도구이자 프로토콜이었다.
With regards to ensuring that a podspec works properly, you, the ‘owner’, and only you are responsible for a podspec working properly.
from CocoaPods blog, CocoaPods Trunk
그동안 번거로웠던 PR & Merge 작업들을 자동화시키는 동시에 PodSpec
와 Trunk
를 이용해 검증받은 작성자가 최소한의 자격요건을 갖추게끔 만들어 패키지 배포에 신뢰성을 더한 셈이다.
이렇게 CocoaPod에 대해 알아보았다.