Private Repository를 CocoaPods과 연동하기

frogKing·2023년 3월 5일
0
post-thumbnail

When

개인 혹은 회사에서 생성한 private 프레임워크 종속성을 프로젝트에 추가 및 관리하고자 할 때 사용한다.

HOW

간단하게 흐름을 소개하자면 우리는 Library Repository와 Spec Repository를 만들어야 한다.

  • Library Repository : 배포할 라이브러리를 갖고 있는 GitHub Repository

  • Spec Repository : Library Repository들의 정보(podspec)를 갖고 있는 GitHub Repository

podfile에 내 Spec Repository 주소를 적고 내가 추가하고 싶은 Library를 명시하게 되면 CocoaPods는 Spec Repo를 보고 내 Library Repo에 찾아가 파일을 다운로드 받게 된다.

이제 큰 그림도 그려봤으니 내 라이브러리를 생성하고 이를 다른 프로젝트에 적용하기까지의 과정을 살펴보자.

1. 라이브러리 생성

터미널에서 라이브러리를 생성할 위치로 이동한 다음, 다음 명령어를 이용하여 라이브러리를 생성한다.

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 ]
 > Yes

마지막까지 입력하면 프로젝트가 생성 및 실행된다.

2. 라이브러리 설정 파일 수정

다음과 같은 경로에서 <라이브러리 이름>.podspec 파일을 클릭한다.

내 라이브러리의 스펙에 맞게 적어주면 된다.

Pod::Spec.new do |s|
  s.name             = 'SWLibrary'
  s.version          = '0.1.0'
  s.summary          = '정말 유용한 라이브러리입니다.'
  s.description      = '정말 유용한 라이브러리라구요~ 이걸 쓰면 어떻게 되냐면.. 블라블라'
  s.homepage         = 'https://github.com/seungwon-yoo/SWLibrary'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'seungwon-yoo' => 'qwer15417@gmail.com' }
  s.source           = { :git => 'https://github.com/seungwon-yoo/SWLibrary.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
  s.ios.deployment_target = '10.0'
  s.source_files = 'SWLibrary/Classes/**/*'
  # s.resource_bundles = {
  #   'SWLibrary' => ['SWLibrary/Assets/*.png']
  # }
  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

source 부분은 이후 3번에서 소개할텐데 github private 레파지토리를 생성한 다음 해당 주소를 넣으면 된다.

3. GitHub 레파지토리 생성

이제 라이브러리 파일이 저장될 Repository를 GitHub에 생성해주어야 한다. 다음과 같이 GitHub에서 private으로 레파지토리를 생성해준다.

4. 제대로 잘 적용됐는지 확인

해당 명령어를 입력하여 .podspec 파일에 입력한 정보가 올바른지 확인한다.

pod spec lint

입력해보니 private reposity로 지정했기 때문에 username과 password를 통해 접근해야 돼서 다음과 같은 에러 메시지가 떴다.

remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/seungwon-yoo/SWLibrary.git/'

사람마다 각자 나타나는 에러 메시지가 다르다보니 이는 따로 구글링해서 찾아보기를 권장한다.

5. 라이브러리 코드 작성

다시 Xcode로 돌아와서 다음과 같은 경로에 있는 ReplaceMe.swift 파일을 내 코드로 바꿔준다.

다음과 같이 간단한 라이브러리를 만들어봤다. public을 붙여주어야 이 라이브러리를 임포트한 쪽에서 사용할 수 있음을 명심하자.

public final class PrintManager {
    public func printWelcomeMessage() {
        print("Welcome!")
    }
}

6. 라이브러리 코드 테스트

앞에서 명령어를 통해 라이브러리를 생성하면서 데모 앱을 추가하겠다는 질문에 yes를 해서 Example > <라이브러리 이름>.xcworkspace 실행 후 ViewController에 내가 만든 라이브러리를 import하고 잘 동작하는지 확인해보았다.

다음과 같이 원하는대로 잘 동작하는 걸 확인할 수 있다.

7. 배포하기

다음 명령어를 통해 github에 생성해줬던 Repository에 라이브러리를 업로드했다. 각각의 명령어는 github을 써봤으면 알 수 있는 것들이라 생략한다.

git add .
git commit -m -m "upload code"
git remote add origin <git 주소>
git tag 0.1.0
git push origin 0.1.0

8. 버전 관리

CocoaPods에서 private repository를 가져오려면 public과 달리 배포된 버전 정보 등을 알 수 없어 ‘배포된 버전 정보 등을 저장, 관리하는 레파지토리’를 내가 만든 github에 추가해야 한다.

이때 ‘배포된 버전 정보 등을 저장, 관리하는 레파지토리’를 Spec Repository라고 한다. 즉 Spec Repository는 .podspec 파일을 갖는 저장소가 된다.

다음과 같이 github에서 Spec Repository를 생성해준다.

그 후 Spec Repo를 추가하기 위해 터미널에 다음 명령어를 입력한다.

pod repo add <spec repo 이름> <spec repo github 주소>

마지막으로 내가 만든 라이브러리의 .podspec 파일을 Spec Repo에 추가해야 한다.

(만약 specification does not validate. 이슈가 뜬다면 -allow-warnings 을 붙여줬더니 해결되었다.)

pod repo push <spec repo 이름> <podspec 파일 경로>

정상적으로 동작이 수행되었다면 다음과 같이 Spec Repo에 내 라이브러리가 추가된 것을 확인할 수 있다.

번외 1 : 잘 되는지 테스트

source 'git@github.com:seungwon-yoo/Specs.git'
target 'ProjectA' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for ProjectA
  pod 'SnapKit'
  pod 'SWLibrary'
end

다음과 같이 사용하고자 하는 프로젝트의 podfile에서 source와 라이브러리 이름을 명시해 준 뒤 pod install 을 실행하였다.

다음과 같이 import 할 때 자동 완성이 되고 잘 사용할 수 있음을 확인할 수 있다.

번외 2 : 팀과 공유하기

내부 팀원과 공유하기 위해서는 Spec Repo(git)의 접근 권한이 필요하다. 또한 local CocoaPods 설치를 위해서 spec private repo가 추가되어 있어야 한다.

template : $ pod repo add [REPO_NAME] [SOURCE_URL]
$ pod repo add test_specs https://github.com/seungwon-yoo/Specs.git

이후에는 번외 1과 같이 Podfile에 source URL을 추가하면 된다.

profile
내가 이걸 알고 있다고 말할 수 있을까

0개의 댓글