Skip to content

[공통] Cocoapods Prebuild Cache 추가 #61

@techinpark

Description

@techinpark

Cocoapods Prebuild 란 ? 🔍

  • Cocoapods 라이브러리를 기본적으로 많이 사용하게되면 빌드 속도가 느려진다.
  • 이유는 소스를 그대로 가져와서 빌드 타임에 framework 로 만드는 과정이 포함되기 떄문이다.
  • 그리하여 최근에 Cocoapods 라이브러리들을 Prebuild 하여 사용하는 라이브러리가 나왔다. (https://github.com/CocoaPods/Rome)

Grab 에서 만든 Prebuild 관리 라이브러리 🚀

  • cocoapods-binary-cache 를 이용해서 느려진 빌드 속도를 조금더 향상 시켜보고자 한다.
  • 기본적으로 cocoapods-binary-cache 라이브러리 뿐 만 아니라 Rome 을 조합해서 사용하여야 한다.
  • 사용하면서 알게 된 것이지만 gemfile 의존성을 잘 확인해서 작업하는 것이 좋다.
  • 그랩에서 만든 라이브러리는 바로 사용 할 수 있는 것이 아니라 Rome로 미리 Prebuild 라이브러리를 생성하고 그것을 이용하여 Prebuild 라이브러리만 만들어 놓은 레포를 생성한 뒤에 이용이 가능하다

Example 분석 👨🏻‍💻

  • 현재 올라가 있는 예제를 보면 다음과 같은 구조로 되어있다.
.
├── GeneratedFrameworks
└── Manifest.lock
  • GeneratedFrameworks
    GeneratedFrameworks 폴더 안에는 Rome 에서 생성된 framework 파일들이 라이브러리명으로
    .zip 압축 되어있으며 그 압축을 풀게되면 형태는 다음과 같다.
- 라이브러리명.framework 
- 라이브러리명.pod_name (비어있음)
  • Manifest.lock
    위 파일은 어떻게 생성했을까? 생각을 해보았는데 내용을 보니 Podfile.lock 과 같은 내용이 들어있어서
pod install

실행 이후에 업데이트된 Podfile.lock 파일을 Manifest.lock 이라는 이름으로 업로드 한것 같았다.

Problems ?

현재 그랩 레포 설명 상에서는 Rome을 활용했다 라는 코멘트만 있을뿐 구체적으로 어떤식으로 생성을해서
깃 레포에 올렸는지는 설명이 되어 있지 않아 현재 Example 로 올라가있는 결과물 만을 보고 동작을 유추해서
비슷하게 따라하는 방법 밖에는 없기 때문에 고민이 많았다..

  • 처음에는 그랩에서 만든 스크립트가 자동으로 깃 레포에 Push 까지 해줄거라 기대했지만, 그런것 같지는 않다.
    그렇기 때문에 일단 다음과 같은 시나리오를 생각해보았다.
  1. Rome을 이용해서 Prebuild 라이브러리를 생성한다.
  2. Example에 있는 것 처럼 레포를 하나 생성하고 같은 구조로 파일을 업로드 한다.
  3. Grab 에서 제공하는 라이브러리 사용형태 대로 빌드를 진행해본다

Doing

  • 위 방법대로 실행하기 위해서는 2번 단계가 손이 많이 가기때문에 간단한 파이썬 스크립트를 작성함
  • 스크립트의 동작은 다음과 같다.

스크립트 동작 시나리오

  • Rome 폴더안에 있는 파일들을 검사하여 라이브러리명.framework 파일들을 라이브러리명 폴더를 생성한 뒤 폴더안에 넣고 그안에 라이브러리명.pod_name 폴더를 만든다.
  • 추후 git push 까지 함. (지금은 필요없다.. 동작 되는지 확인 이후에 추가해도 무방)

스크립트

실행 방법

$ bundle install
  • 최초 실행시
$ bundle exec pod binary-cache --cmd=prebuild
  • 최초 실행이 아닌경우
$ bundle exec pod binary-cache --cmd=fetch
$ bundle exec pod install

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions