앱 개발 강의를 들으면서 CocoaPods을 자연스럽게 배운 사람으로서 CocoaPods 없이 외부 라이브러리를 관리하는 방법을 찾아봤다.
추가한 라이브러리가 또다른 라이브러리를 참조하고 있다면?
추가한 라이브러리의 최신 버전이 나온다면?
개발자가 일일이 라이브러리를 관리하기 번거로워진다..!
앱에 써드파티 라이브러리를 추가 및 관리할 용도로 작성된 라이브러리 종속성 관리 도구.
Ruby 프로그래밍 언어로 작성되어 있으며, RubyGems 패키지 매니저를 사용하여 설치할 수 있다.
CocoaPods를 사용하면 프로젝트의 Podfile에 라이브러리 종속성을 정의하고, 명령어를 실행하여 라이브러리를 설치할 수 있다.
CocoaPods는 GitHub에서 호스팅되는 수천 개의 오픈 소스 라이브러리를 지원한다.
CocoaPods는 라이브러리 배포 및 관리를 위한 기능을 제공한다. CocoaPods Trunk 서비스를 사용하여 개발한 라이브러리를 CocoaPods에서 배포할 수 있다.
CocoaPods 라이브러리를 빌드 및 배포하기 위한 파일.
아래 코드는 SnapKit.podspec 코드이다.
Pod::Spec.new do |s|
s.name = 'SnapKit'
s.version = '5.6.0'
s.license = 'MIT'
s.summary = 'Harness the power of auto layout with a simplified, chainable, and compile time safe syntax.'
s.homepage = 'https://github.com/SnapKit/SnapKit'
s.authors = { 'Robert Payne' => 'robertpayne@me.com' }
s.social_media_url = 'http://twitter.com/robertjpayne'
s.source = { :git => 'https://github.com/SnapKit/SnapKit.git', :tag => '5.6.0' }
s.ios.deployment_target = '10.0'
s.osx.deployment_target = '10.11'
s.tvos.deployment_target = '10.0'
s.source_files = 'Sources/*.swift'
s.libraries = 'swiftCoreGraphics'
s.xcconfig = {
'LIBRARY_SEARCH_PATHS' => '$(SDKROOT)/usr/lib/swift',
}
s.swift_versions = ['5.0']
end
CocoaPods에서 사용할 라이브러리를 지정하는 파일.
source 'https://github.com/CocoaPods/Specs.git' // (1)
source 'https://github.com/Artsy/Specs.git' // (2)
platform :ios, '9.0' // (3)
inhibit_all_warnings! // (4)
target 'MyApp' do
pod 'GoogleAnalytics', '~> 3.1' // (5)
# Has its own copy of OCMock
# and has access to GoogleAnalytics via the app
# that hosts the test target
target 'MyAppTests' do
inherit! :search_paths
pod 'OCMock', '~> 2.0.1' // (6)
end
end
(1) CocoaPods는 PodSpec을 통해 라이브러리를 인식하고 분류하기 때문에 이러한 PodSpec이 있는 주소를 알아야 제대로 동작할 수 있다.
source https://github.com/CocoaPods/Specs.git
은 따로 적지 않아도 기본값으로 세팅되어 있다.(2) 원하는 Spec 저장소를 연결할 수 있다. 기업에서 사용할 때 private한 Spec 저장소로 사용하는 경우가 많다.
(3) 해당 플랫폼, 버전에 맞춰서 설치된다. 버전은 deployment target으로 앱에서 지원하는 최소 버전을 의미한다.
(4) 빌드 시에 라이브러리에서 발생하는 warning을 무시한다. 불필요한 warning이 많으면 필요한 정보를 놓칠 수 있어 사용하기도 한다.
(5) 최소 3.1 이상 4.0 미만 버전을 사용하는 것을 의미한다. 라이브러리의 depth에 MyAppTests
타겟을 표시하면 해당 라이브러리를 공통으로 사용하게 된다.
(6) 최소 2.0.1 이상 2.1 미만 버전을 사용한다. MyAppTests
타겟에서는 GoogleAnalytics
, OCMock
둘 다 사용이 가능하다.
Podfile에서 라이브러리를 설치하기 전과 후에 실행할 수 있는 스크립트.
pre_install
라이브러리를 설치하기 전에 특정 디렉토리를 생성, 환경 변수 설정 및 다른 스크립트를 실행하고자 할 때 사용된다.라이브러리를 설치하기 전에 실행되는 스크립트.
post_install
라이브러리를 설치한 후에 커스텀 설정을 적용, 다른 스크립트를 실행 및 프로젝트 파일을 수정하고자 할 때 사용된다.라이브러리를 설치한 후에 실행되는 스크립트.
podfile에서 다음과 같이 사용할 수 있다.
pre_install do |installer|
# 라이브러리 설치 전에 실행할 스크립트 내용
end
post_install do |installer|
# 라이브러리 설치 후에 실행할 스크립트 내용
end
CocoaPods에서 사용할 라이브러리의 버전을 고정하는 파일.
pod install
명령을 실행할 때 생성된다. CocoaPods가 설치한 각 라이브러리의 버전 정보 및 의존성 관계를 기록하게 된다.PODS: // (1)
- SnapKit (5.6.0)
DEPENDENCIES: // (2)
- SnapKit
SPEC REPOS: // (3)
trunk:
- SnapKit
SPEC CHECKSUMS: // (4)
SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25
// (5)
PODFILE CHECKSUM: 6363da1f880a8bd2a65e47aee1657c36941adca3
// (6)
COCOAPODS: 1.11.3
(1) PODS: 프레임워크 이름과 버전 명시
(2) DEPENDENCIES: 의존성을 구분하기 위하여 프레임워크를 나열함
(3) SPEC REPOS: 프레임워크들의 다운받는 주소 명시
(4) SPEC CHECKSUMS: pod 버전에 관한 유일성을 보장하는 값
(5) PODFILE CHECKSUM: podfile에 관해 유일성을 보장하는 값
(6) COCOAPODS: 코코아팟 버전
Xcode에서 Build Phases는 빌드 전처리, 컴파일, 링크, 리소스 복사 등 다양한 작업을 수행하게 된다.
Link Binary With Libraries
는 원래 수동으로 라이브러리를 추가하면 라이브러리의 이름과 상태가 적혀있게 되는데 우리는 CocoaPods로 라이브러리를 관리하기 때문에 Pods 프레임워크가 적혀있는 것을 확인할 수 있다.
[CP] Embed Pods Frameworks
는 빌드 과정에서 CocoaPods를 사용하기 위해 빌드 시점에 실행될 스크립트를 정의하는 부분이다. SnapKit을 사용하기 위해 Run script를 작성하는 것과 같다고 보면 된다.