🍎 iOS/iOS 심화 & 응용

[iOS] 자체 private repository 라이브러리 Cocoapods 배포하기

dev_zoe 2024. 12. 5. 21:52
반응형

회사에서 주요 비즈니스 로직에 사용되는 코드 모음을 개발할 필요가 있었는데, 이 사이즈가 크기도 하고 평소에 나만의 라이브러리를 만드는것에 관심이 있어서, 단순 프로젝트 내 코드 모음이 아닌 사내 라이브러리를 배포해보기로했다.

 

*해당 글은 사내에서 사용할 라이브러리이기 때문에 private repository 에서 Cocoapods로 배포하는 과정이므로 공개 repository 배포와는 과정이 조금 다를 수 있습니다.

 

먼저 private repository를 Cocoapods으로 배포하여 라이브러리 형태로 사용하기 위해서는 2가지 레포지토리가 필요하다.

- pod repository (개발한 라이브러리 코드 레퍼지토리)

- podspec repository

(해당 Cocoapods 라이브러리의 podspec을 관리하는 전용 레퍼지토리이며, private repository의 경우 Cocoapods/Specs가 아닌 자체 Spec을 관리하는 repository를 생성해야한다.)

 

pod spec에 관한 자세한 사항은 Cocoapods 공식문서 참고

-> https://guides.cocoapods.org/making/specs-and-specs-repo.html

https://github.com/CocoaPods/Specs

https://guides.cocoapods.org/making/private-cocoapods.html

 

1. 먼저 private repository를 생성 및 클론 한뒤, 해당 위치에서 다음과 같은 명령어를 통해 라이브러리를 생성한다.

pod lib create <라이브러리 이름>

 

그렇게 되면 다음과 같은 질문들이 쭉쭉 뜰텐데, 알맞은 것을 선택한다.

What platform do you want to use?? [ iOS / macOS ]
 > iOS

What language do you want to use?? [ Swift / ObjC ]
 > Swift

Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

Which testing frameworks will you use? [ Quick / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > No

 

2. 아래와 같이 Demo Project가 생성되는데, Pods > Development Pods 그룹에서 라이브러리로서 작동할 코드를 작성하면 된다.

 

이 때 라이브러리를 Cocoapods으로 설치하게 되면 다른 외부 모듈을 사용하는 것이기 때문에,

코드에 접근제어자인 open과 public을 적절히 활용해야한다.

 

3. Cocoapods의 명세서와 같은 .podspec 확장자 파일을 찾아 오픈하여 설정을 반영한다. (매 버전 배포할 때마다 변경해야하는 사항)

#
# Be sure to run `pod lib lint iOSSdk.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'iOSSdk'
  s.version          = '0.1.0'       // 라이브러리 버전
  s.summary          = 'iOS 모듈'     // 라이브러리 이름

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'git 주소'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'git nickname' => 'git id' }
  s.source           = { :git => 'git 주소', :tag => s.version.to_s }

  s.ios.deployment_target = '13.0'      // 최소 지원버전

  s.source_files = 'Sources/iOSSDK/Classes/**/*'      // 소스파일 경로 지정
  

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  s.swift_versions = '5.0'
  
  s.dependency 'SwiftSoup'    // 해당 라이브러리가 다른 라이브러리에 dependency가 있으면 기재

end

 

- 여기서 중요하게 봐야할 부분은 's.source_files' 부분인데, 기존 Pods > Development Pods에서 개발한 모든 코드를 해당 경로로 옮겨주어야한다.

- 이렇게되면 Demo Application의 Development Pods의 코드가 비게 되면서 오류가 날텐데, s.source_files에 명시한 파일 폴더에 'Reference File Folders' 옵션을 체크하여 옮겨주면된다. (혹시 Demo Project에서 오류 발생시, Demo Project인 모듈명.xcworkspace가 있는 Example 폴더로 이동하여 pod clean 해보고 다시 cocoapods 설치해보기)

 

4. 라이브러리 개발이 완료되었다면, private repository에 커밋 후에 .podspec 파일에 기재한 s.version과 동일한 버전으로 태깅한다. (매 버전 배포할 때마다 변경해야하는 사항)

// 태그하는 버전과 .podspec의 s.version 버전은 반드시 일치해야한다.
git tag 0.1.0
git push origin 0.1.0

 

여기까지 완료되었다면, Cocoapods private repository에 들어가게되면 아래와같이 보일것이다.

 

5. Private Spec Repositorty 생성 및 등록

그 다음, 위에 설명했던것처럼 해당 Cocoapods 라이브러리를 사용할 수 있도록 Cocoapods Spec repository에 등록하는 작업을 해야하는데 자체 Private Repository이기 때문에 자체 Spec Repository를 생성 후 적용해야한다.

구분하기 쉽도록 나는 프로젝트 명을 "[라이브러리명]Spec" 이라고 지었다.

 

그리고 아래 명령어를 통해 Private Spec Repository에 내가 만든 라이브러리에 관한 podspec을 등록한다.

pod repo add [spec repo 이름] [spec repo github 주소]

 

6. pod spec lint를 통한 .podspec 유효성 검증 (매 버전 배포할 때마다 변경해야하는 사항)

터미널에서 .podspec이 있는 위치로 이동하여 (cd [.podspec 이 있는 라이브러리 절대경로])

아래와 같은 명령문을 수행하여 프로젝트 코드와 podspec에 문제가 없는지 검증해야만 해당 버전의 코드를 올릴 수 있다.

pod spec lint --allow-warnings

 

*--allow-warnings 옵션을 붙이는 이유는 해당 옵션을 안붙이면 warning이 하나라도 존재하지 않으면 lint 수행에 실패한다. warning을 무시하고 레포를 올리고싶다면 해당 옵션을 꼭 붙여줄것 (나는 크리티컬한 warning은 아니라서 그냥 이 옵션을 사용하고있다)

 

 

성공하면 이렇게 초록색으로 '.podspec passed validation'이 뜰것이다.

주의점은 podspec은 s.version에 명시한 프로젝트 버전에 대한 검증을 진행하는것이기 때문에 위 3-4번을 반드시 거치고 수행하여야함

 

여기까지 성공하고나서 PodSpec Repository에 들어가보면 다음과 같이 보일것이다. 

[Update] 프로젝트명 (버전)

 

여기까지 왔다면, 이제 다른프로젝트에서 해당 라이브러리를 사용해볼 차례이다.

 

7.  생성한 라이브러리를 사용할 프로젝트의 Podfile에 다음내용 추가

밑줄친 것처럼 위에 아래 코드를 추가하고,

source '[Spec Repository URL]'

 

 

그리고 평상시에 우리가 다른 라이브러리를 Pod install 하는것처럼

pod '[라이브러리 이름]'

 

를 추가하여 pod install을 수행하면 성공적으로 실행될것이다.

이후 자체 라이브러리 버전을 업데이트 할때에도 마찬가지로 pod update 하면 된다.

 

💡 개발 하다보면 코드를 다 짜고, demo application에서도 정상적으로 작동하면 이제 해당 라이브러리를 사용할 다른프로젝트에서 정상적으로 사용가능한지 등 로컬에서 테스트하고싶을 때가 있지않은가 ?!!! 혹시 문제가 생기면 위 3-4번부터 다시 번거로운 과정을 거쳐야하는데 이러면 매우 번거롭다.

 

local에서 내가 만든 cocoapods를 install하여 테스트하려면 다음과같이 하면 된다. (실시간으로 라이브러리에서 코드 수정도 가능함)

pod '라이브러리 이름', :path => '내가 만든 라이브러리 절대경로'

 

그럼 해당 라이브러리를 적용한 프로젝트에서 같이 테스트하며 즉각적으로 수정하며 테스트가 가능하다.

 

reference

https://guides.cocoapods.org/making/private-cocoapods.html

https://velog.io/@qwer15417/Private-Repository%EB%A5%BC-CocoaPods%EA%B3%BC-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

https://gist.github.com/radiospiel/2009100

반응형