코코아팟 톺아보기

코코아팟이란?

코코아팟(CocoaPods)은 Swift 및 Objective-C 언어 환경 프로젝트의 의존성을 관리해주는 도구입니다. 언어의 특성상 코코아(Cocoa) 및 코코아터치(Cocoa Touch) 프레임워크에서 사용할 수 있는 라이브러리가 대다수를 이룹니다. 7만개 이상의 라이브러리를 보유하고 있고, 300만개 이상의 애플리케이션에서 코코아팟을 활용 중 입니다. Podfile에 사용할 라이브러리만 명시해주면 자유롭게 프로젝트에서 사용할 수 있어 많은 프로그래머가 사용합니다.

코코아팟 설치하기

코코아팟은 기본적으로 Ruby로 개발되어 있습니다. macOS에 기본적으로 설치되어 있는 Ruby로 설치가 가능합니다. 터미널에서 sudo gem install cocoapods 명령어를 입력해주기만 하면 됩니다.

Pod 설치하기

프로젝트 경로로 이동하여 코코아팟을 프로젝트에 연동합니다. pod init 명령어를 실행하면 의존성을 관리할 Podfile 이 생성됩니다.

Podfile 을 열어 사용할 Pod를 명시해줍니다.

target 'MyApp' do
  use_frameworks!
  pod 'Alamofire', '~> 3.0'
end

Podfile 에 대한 자세한 설명은 아래에서 따로 다루도록 하겠습니다.

위 명령어를 실행하면 명시된 Pod 라이브러리들을 프로젝트로 받아오게 됩니다. 이 후부터는 .xcodeproj 가 아닌 .xcworkspace 프로젝트 파일을 열어 작업을 해야합니다. .xcworkspace.xcodeproj의 모음, 즉 Xcode 프로젝트를 워크스페이스라는 하나의 작업공간으로 묶어놓은 단위입니다. 여러 Xcode 프로젝트의 의존성을 연결할 수 있는 방법이죠. 그래서 코코아팟을 통해 라이브러리를 가져오면 기존 프로젝트와 의존성을 맺어주기 위해 워크스페이스를 생성해 주는겁니다. 처음에 생성한 프로젝트와 받아온 Pod들을 묶어서 하나의 워크스페이스로 구성하여 기존 프로젝트 이름과 동일한 이름의 워크스페이스를 만들어줍니다.

Pods 프로젝트가 전역으로 관리되는 것은 아닙니다. 워크스페이스에 여러개의 프로젝트가 포함되어 있다면 Podfile에서 각 프로젝트에 원하는 라이브러리 의존성을 추가하여 개별적으로 사용할 수도 있습니다.

platform :ios, '13.0'
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!

workspace 'MyApp'

target 'MyApp1' do
    project 'MyApp1/MyApp1'

    pod 'SwiftSVG'
    pod 'SwiftLint'
end

target 'MyApp2' do
    project 'MyApp2/MyApp2'

    pod 'Kingfisher'
    pod 'Alamofire'
end

이제 사용하고 싶은 라이브러리를 해당 프로젝트에서 import 하여 사용하면 됩니다.

import Alamofire

Podfile?

가져올 Pod의 버전 명시

항상 최신 버전의 라이브러리를 사용하고 싶다면 따로 Pod 버전을 명시하지 않으면 됩니다.

pod 'Alamofire'

한 버전을 특정할 수도 있습니다.

pod 'Alamofire', '1.0'

버전에 대하여 조건을 명시할 수도 있습니다.

  • > 0.1 0.1 보다 높은 버전
  • >= 0.1 0.1 이고 보다 높은 버전
  • < 0.1 0.1 보다 낮은 버전
  • <= 0.1 0.1 이고 보다 낮은 버전

부등호 이외에 ~> 연산자를 활용할 수 있습니다.

  • ~> 0.1.2 0.1.2 이상이지만 0.2 보다는 낮은 버전 (0.2는 포함하지 않음)
  • ~> 0.1 0.1 이상이지만 1.0 보다는 낮은 버전 (1.0은 포함하지 않음)
  • ~> 0 실질적으로 포함시키지 않는다는 의미
    버전 정책에 대한 좀 더 자세한 사항은 Semantic Versioning 을 참고하시면 좋습니다.

Podfile.lock?

pod install 을 하고나면 Podfile 이외에 Podfile.lock 이라는 파일이 같이 생깁니다. Podfile.lock 은 pod들의 버전을 계속 추적하여 기록해놓고 유지시키는 역할을 합니다. 또한 Podfile.lock 에는 유일성을 보증하는 해쉬값인 CHECKSUM이 부여됩니다. 만약 pod 버전에 하나라도 변화가 생긴다면 CHECKSUM 또한 변하게 되는 것 입니다. 이 경우엔 Git을 사용할 경우 Podfile.lock 이 diff로 잡히게 됩니다. CHECKSUM이 변함없이 유지된다는 것은 협업하는 환경에서는 pod 버전을 모두가 동일하게 사용하고 있음을 의미하기도 합니다. 그러므로 pod 버전을 업데이트 했다면 Podfile.lock 도 같이 커밋해야겠죠?

PODS:
  - Alamofire (4.8.2)
  - Crashlytics (3.13.2)
  .
  .
  .
PODFILE CHECKSUM: f647c0698abc31d48952ce58077we758abse2

명령어

pod install

프로젝트에 pod을 맨 처음에 세팅하기 위하여 사용합니다. 또, Podfile에 pod을 추가, 수정, 삭제할 때에도 사용됩니다. Podfile에서 pod의 버전 조건을 수정한 후 pod install하면 다른 버전의 pod을 가져오고, Podfile에서 pod을 추가하고 pod install 명령어를 실행하면 새로운 pod을 다운받고 설치하며 Podfile에서 pod을 삭제하고 pod install하면 기존의 pod을 삭제합니다. 그리고 각 pod 마다 설치된 버전을 Podfile.lock 에 기록해 놓습니다. pod install 을 실행하면, Podfile.lock에 리스트된 팟들에 대해선 지정된 버전만 다운받습니다. 새로운 버전이 존재하는지 체크하지 않는 것이죠. Podfile.lock에 리스트되지 않은 팟들은 Podfile에 명시된 버전 조건으로 검색하여 다운로드 받습니다.

pod update

코코아팟은 해당 팟의 업데이트된 버전이 있는지 검색합니다. Podfile.lock을 참조하지 않습니다. 이 명령어는 팟을 최신 버전으로 업데이트 시켜주는 것입니다. (단, Podfile에 명시해둔 Pod의 버전 조건과 일치해야 합니다.) 단순하게 pod update 를 실행시하면 코코아팟은 모든 현재 프로젝트의 팟에 대해 Podfile에 명시해둔 버전조건에 부합하는 최신 버전으로 업데이트를 실행합니다.

pod update {팟이름} -> 개별적인 pod 에 대한 업데이트도 가능합니다.

pod outdated

pod outdated 를 실행하면, 코코아팟은 Podfile.lock에 리스트된 것보다 새로운 버전을 가진 모든 팟을 나열합니다. 이 팟들에 대해 pod update {팟이름} 을 실행한다면 업데이트가 될 것이라는 것을 의미합니다. (단, Podfile의 버전 조건과 일치해야 합니다.)

pod repo update

/Users/{사용자이름}/.cocoapods/repos 에 있는 모든 podspec 파일을 업데이트 합니다. podspec 파일에는 해당 pod 의 주소 등 중요한 정보들이 담겨있습니다. podspec 파일에 대한 자세한 설명은 다음 단계에서 다루겠습니다.

spec.source = { :git => 'https://github.com/Alamofire/Alamofire.git', :tag => 'v3.1.1' }

.cocoapods/repos 에는 모든 pod에 대해 가능한 버전들의 podspec 파일들이 모여있습니다. pod repo update 를 실행하게 되면 최신 podspec 파일들로 업데이트되게 되는 것입니다. 추가한 라이브러리에 대한 podspec 이 업데이트되지 않아 오류가 날 경우 이 명령어를 통하여 해결할 수 있습니다.

pod repo update {팟이름} -> 개별적인 pod 에 대한 업데이트도 가능합니다.