sungyup's.

dev_toolkits / Tools / 1.1 CocoaPods

1.1CocoaPods

ios의 의존성 관리 도구 CocoaPods

TL;DR

추억의 쪽지 시험

React Native 프로젝트에 온보딩하며, 기본적인 세팅을 하는 중 CocoaPods 관련 에러(이후 언급할 Ruby gem compilation issue)가 발생한지라 관련해서 개념을 정리하고자 한다.

CocoaPods란?

cocoapods logo
CocoaPods 로고

CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. (공식문서)

Node.js 생태계의 npm, yarn에 대응하는 ios 및 macOS 개발의 의존성 관리 도구이다.

React Native로 개발을 할 때 설치하는 외부 의존성 라이브러리는 단순히 JS코드만 있는게 아니라 iOS 네이티브 코드(Objective-C나 Swift)도 포함되어 있다. 이 네이티브 부분을 Xcode 프로젝트에 포함시켜야 실제 앱 빌드 시 작동하기 때문에 React Native의 npm 외에도 CocoaPods가 필요하게 된다.

따라서 npm install로 JS 패키지를 설치한 뒤, iOS에선 pod install을 실행해 네이티브 라이브러리를 추가해줘야 리액트 네이티브 앱이 연결되어 있는 자바스크립트 코드 및 iOS 네이티브 코드가 모두 포함된다.

CocoaPods의 동작 원리

CocoaPods는 Podfile이라는 설정 파일을 기반으로 동작한다. CocoaPods는 기본적으로 Ruby로 작성되었기 때문에, Podfile 또한 Ruby로 되어 있다. React Native에선 프로젝트를 생성할 때 기본적으로 ios/폴더 안에 Podfile이 생성된다.

ruby
target 'MyApp' do pod 'React', :path => '../node_modules/react-native/' pod 'Firebase/Core' end

새로운 네이티브 모듈이 추가되면, cd ios && pod install을 실행해서 Pod 라이브러리를 설치해줘야 한다. 이 라이브러리들은 iOS 빌드 과정에서 자동으로 링크된다.

라이브러리 관련 용어, Gem과 Pod

GemRuby의 패키지(라이브러리)다. 예를 들어, cocoapods 또한 Ruby로 쓰인 라이브러리, 즉 Gem의 한 예다. 반면 Pod은 iOS/macOS 개발에서 CocoaPods가 관리하는 라이브러리다. 앞서 살펴본 Firebase가 pod이다.

xcodeproj와 xcworkspace

iOS 개발의 프로젝트 설정, 빌드 타겟 정보 등은 Xcode 프로젝트 파일인 프로젝트명.xcodeproj에 저장된다. 원래는 이 폴더만으로 개발했지만, CocoaPods써서 pod install을 하면 프로젝트명.xcworkspace 폴더가 생성된다.

이 폴더는 내 앱 프로젝트인 프로젝트명.xcodeproj와 CocoaPods가 만든 외부 라이브러리 프로젝트인 Pods.xcodeproj를 묶는 묶음 역할을 한다. 따라서 CocoaPods를 쓰는 React Native 프로젝트에선 항상 .xcworkspace를 열고 실행해야 Pod 라이브러리들이 정상 동작한다.

종종 발생하는 문제들

React Native 프로젝트에서 발생하는 CocoaPods 관련 문제들은 대표적으로 아래와 같다:

  • Ruby 버전 충돌: CocoaPods가 Ruby로 동작하기 때문에 Ruby 버전 충돌 시 빌드 에러가 난다.
  • 의존성 충돌: Pod간 버전 호환성 문제로 pod update가 필요할 때가 있다.

내가 마주한 문제는 CocoaPods 설치/업데이트를 하려는데 Ruby 버전 차이 때문에 gem을 컴파일(빌드)하는 과정에서 에러가 생겼다는 의미였다.

PreviousNo previous post