맥북을 초기화 하고선 오랜만에 Xcode 프로젝트를 빌드를 실행해봤더니

cocoaPod으로 사용중이였던 GoogleMobileAds 메이저 버전이 업데이트되어 코드수정이 필요한 상태가 되버렸다.
물론 최신버전으로 코드를 수정할 예정이지만 이를 대비하기 위해서 cocoaPods 버전을 고정하는 방법을 남기고자 한다.
사실 pod install 을 통해 외부 라이브러리를 사용한다는 개념은 익숙하지만 CocoaPods 가 뭐냐 라고 했을때는 음..? 이런 생각이 들었었다.
그래서 찾아보니 이렇게 말할 수 있겠다.
CocoaPods는 iOS와 macOS 앱 개발에서 사용되는 의존성 관리 도구
의존성 관리 도구 라는 명칭을 한번 되세기며
Podfile 과 Podfile.lock 간의 차이점도 살펴봤다
Podfile 은 어떤 라이브러리를 쓸지 적어두는 설정 파일 (의존성을 설치하기 위한 파일)
즉 Podfile 상에 어떤 라이브러리가 필요한지를 명시해두면 이 Podfile 을 기반으로 pod install 명령어를 통해 의존성이 설치된다.
근데 그러면 Podfile.lock 은 무엇일까
내 프로젝트에 설치된 라이브러리들의 정확한 버전 정보를 저장해두는 파일
라이브러리가 내부적으로 라이브러리를 사용하는 경우도 있기에
실제로 설치된 각 라이브러리들의 정확한 버전 정보가 Podfile.lock 으로 남게 되며 이를 통해 버전이 고정되는 셈이다.
즉 라이브러리의 버전이 올라감에 의해 예상치 못한 이슈가 발생되지 않도록 의존성 고정 역할하는 파일인 셈이다.
협업간에는 이 Podfile.lock 파일을 통해 버전이 일치되는 셈이죠
근데 Podfile 기반으로 pod install 이 되고 Podfile.lock 파일이 생성된다면
Podfile 상에 버전 고정을 남겨두면 Podfile.lock 을 굳이 공유할 필요가 있나?
이런 물음이 생겨서 GPT에게 물어봤더니

오 pod install 이 무조건 Podfile 기준으로 설치하는 것이 아니였다는 사실!
오히려 Podfile.lock 파일이 있다면 이를 기준으로 설치된다고 합니다!


이러한 구조로 Podfile.lock 파일까지 함께 공유가 되어야 팀원들끼리 동일한 버전의 라이브러리가 설치되는 구조였습니다!
그러면 Podfile.lock 이 있는 상태에서 Podfile 의 버전을 수정하고 pod install 을 하면?
pod install 은 Podfile.lock 기반이기에 동일하겠죠?
그래서 Podfile 기반으로 pod install 을 하고 싶은 경우에는 pod update 명령어를 사용해야 한다고 합니다
그러면 Podfile.lock 도 업데이트가 된다고 합니다!
이제 다시 돌아와서, 맥북을 초기화하고서 pod install 을 했더니 라이브러리가 최신버전으로 설치됨에 따라 이전 버전의 코드가 빌드가 안되는 상황인데
이를 다시 말하면 이런 상황인 셈이죠
확인해보니


오 둘다 맞았습니다!
그래서 이제 필요한 작업은 Podfile 상에 버전을 고정시키는 작업이 필요한 것이죠
마지막으로 Podfile 상에서 버전을 명시하는 몇 가지 방식들이 있어 정리하고, 버전을 고정시켜 봅시다.
Alamofire 라이브러리를 예시로 하면
pod 'Alamofire', '5.4.4'pod 'Alamofire', '~> 5.4'이 외에도 몇 가지 추가적인 방식들이 있는데 크게 두 가지 방식으로 버전 고정을 명시하는데
~> 방식을 사용하는 경우 최신 패치가 적용되기에 좀더 선호되는 버전 고정 방식인 것 같습니다!
그러면 지금 저의 Podfile.lock 파일을 먼저 살펴보면

GoogleMobileAds 버전이 12.3.0 으로 설치되어 있다.
그러면 11, 혹은 10 메이저로 내려봐야 이전 코드로 빌드가 될 수 있다는 말이네요!
pod 'Google-Mobile-Ads-SDK', '~>11.13'

이렇게 수정한 이후에 pod update 명령어를 쳐보겠습니다.


오 최신버전이였던 12.3.0 에서 11.13.0 로 설치되었습니다!

최종적으로 이렇게 빌드 성공!
그러면 이렇게 된 현상의 주된 원인은 아마도 Podfile.lock 파일이 .gitignore 상에 있었기 때문이였겠죠?

정답이였습니다!
앞으로는 Podfile, Podflie.lock 은 .gitignore 하지 않는 것으로 확실하게 인지할 수 있겠네요 👍