본문 바로가기

iOS/3rd Party Library

[iOS] CocoaPods - 기본설명

 

 

Cocoa Pod이란?


🔗 CocoaPods.org

  • Swift 및 Objective-C 언어 환경 프로젝트의 의존성을 관리해주는 도구입니다. 언어의 특성상 코코아(Cocoa) 및 코코아터치(Cocoa Touch) 프레임워크에서 사용할 수 있는 라이브러리가 대다수를 이룹니다.
  • 코코아팟은 Ruby로 개발되었습니다.

 

 

👨🏻‍💻 사용방법


설치하기

# 코코아팟 설치 (macOS는 기본적으로 Ruby설치되어있음)
$ sudo gem install cocoapods 

 

 

📃 Podfile

Podfile이란? 프로젝트의 의존성을 관리해주는 파일입니다.

Podfile은 Xcode 프로젝트 경로에서 관리합니다.

 

Podfile 생성명령어

# Podfile 생성 - (Xcode 프로젝트 경로에서 실행)
$ pod init

 

Podfile 작성방법

 

기본 구조 설명

  • 1번라인의 platform 명령어는 프로젝트의 최소 지원 iOS 버전을 지정합니다.
  • 3 ~ 18번라인은 Xcode 프로젝트의 target을 명시하고 해당 블록 안에서 설치할 라이브러리들을 정의합니다.
    • pod ‘라이브러리명’ 명령어로 라이브러리를 설치합니다.
    • 9 ~ 12번 라인의 MyAppTests 타겟에서는 Alamofire, Quick 라이브러리를 모두 사용할 수 있습니다.
    • 14 ~ 16번 라인은 MyAppUITests 타겟에서는 Alamofire 라이브러리를 사용할 수 있습니다.
  • 4번라인의 use_frameworks! 명령어는 CocoaPods이 해당 타겟에서 동적 프레임워크를 사용하도록 지시합니다.
  • 5번라인의 inhibit_all_warnings! 명령어는 Xcode에서 빌드 중 라이브러리에서 발생하는 경고를 무시하도록 설정합니다.
  • 20 ~ 26번라인의 post_install 블록은 라이브러리가 모두 설치된후 실행됩니다. 해당 블록을 통해 특정 작업을 추가할 수 있습니다.

 

 

버전 명시

# 최신버전 설치 
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를 참고합니다.

 

 

타겟별 설정방법

 

platform :ios, '13.0'

use_frameworks!

# 워크스페이스 설정 - (생략 가능)
workspace 'MyApp'

target 'MyApp1' do
    # MyApp1 프로젝트 파일 사용
    project 'MyApp1/MyApp1'

    pod 'SwiftSVG'
    pod 'SwiftLint'
end

target 'MyApp2' do
    # MyApp2 프로젝트 파일 사용
    project 'MyApp2/MyApp2'

    pod 'Kingfisher'
    pod 'Alamofire'
end
  • 워크스페이스에 여러개의 타겟이 포함되어 있다면 Podfile에서 각각의 타겟에 원하는 라이브러리 의존성을 추가하여 개별적으로 사용할 수도 있습니다.

 

Pod 묶음으로 처리하기

platform :ios, '14.0'

# false로 설정하면 pod install을 실행할 때마다 새로운 UUID가 생성합니다.
install! 'cocoapods', :deterministic_uuids => false

# def 명령어로 Pod을 묶을 수 있습니다.
def share_pods
  pod 'RxSwift', '6.2.0'
  
  # 1. subspecs 옵션을 통해 지정한 서브스펙만 포함되도록 지정
  # 서브스펙(subspecs)은 라이브러리 내의 특정 기능이나 모듈을 의미합니다.
  # 2. configuration 옵션을 통해 지정한 빌드 구성에서만 포함되도록 지정합니다.
  pod 'LookinServer', :subspecs => ['Swift'], :configurations => ['Debug']

  # path 옵션을 통해 수동으로 설치
  pod 'FSCalendar', :path => "./MyApp/CocoaPods/FSCalendar"
end

target 'MyApp' do
 
  # use_frameworks, inhibit_all_warnings, post_install 블록들은 타겟별로 각각 설정도 가능
  use_frameworks!
  inhibit_all_warnings!  

  share_pods
  
  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      end
    end
  end

end

 

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 확인하여 설치하기

Pod을 설치할 때 각각의 Pod들 내부에서 추가되는 의존성들이 중복되거나 버전들이 맞지 않는 경우 제대로 설치되지 않을 수 도 있기 때문에 확인하여 설치를 진행해야 합니다.

🔗 Cocoa Pod 검색창에서 라이브러리 검색후 🔗 CocoaPods Spec 이동하여 pospec파일을 확인하여 dependencies 키값에서 중복되거나 버전이 다른 경우 Podfile을 수정해서 맞춰주는 작업을 합니다.

 

{
  "name": "FirebaseCrashlytics",
  "version": "10.5.0",
  
  ...
  
  "dependencies": {
    "FirebaseCore": [
      "~> 10.0"
    ],
    "FirebaseInstallations": [
      "~> 10.0"
    ],
    "PromisesObjC": [
      "~> 2.1"
    ],
    "GoogleDataTransport": [
      "~> 9.2"
    ],
    "GoogleUtilities/Environment": [
      "~> 7.8"
    ],
    "nanopb": [
      ">= 2.30908.0",
      "< 2.30910.0"
    ]
  },
  
  ...
}
  • 예시를 살펴보면 FirebaseCrashlytics 10.5.0버전을 설치할 때 FirebaseCore도 함께 설치되는데 만약 다른 Pod dependencies에서 설치되는 FirebaseCore가 10.0보다 이전 버전이라면 설치가 진행되지 않을 수 있기 때문에 확인해야 하고 중복되는 경우는 중복으로 명시하지 않아도 됩니다.

 

🔗 참고링크