Trouble Shooting - [Xcode] Implicit conversion loses integer precision Warning

yescoach·2022년 5월 12일
0

트러블 슈팅

목록 보기
1/2
post-thumbnail

이번에 학교에서 프로젝트 진행할때 SPM을 통해 Firebase iOS SDK를 추가했는데, 빌드와 동시에 몇백개의 경고가 등장하더라구요,,ㅠㅠ
단순히 경고문만 보고 구글링했다가 결국 해결하지 못하고 넘어갔는데, 이번에 브랜치 머지하면서 해결하고 넘어가야 될 것 같아서 정리하게 되었습니다.
이 문제에 대한 원인은 아직도 모르겠어요..
앞으로 이런 상황이 발생했을때 어떻게 해야겠다 정도로만 짚고 넘어가려고 해요

(수정)
이번에 firebase latest version 에서 발생한 이슈라고 합니다
firebase-ios-sdk 버전을 낮추거나, 이슈가 해결될 때까지 기다리면 될 것 같아요ㅠㅠ
2번 방법의 경우 Resolve 해서 받아온 패키지가 Latest version이 아니여서 warning이 뜨지 않는 것 같아요.

1. 왜 에러(경고)가 발생했는지 파악하기

습관적으로 에러가 발생했을때 무지성 복붙으로 찾아보곤 하는데요.
이번에 겪었던 에러는 구글링을 했을때 마땅한 답을 찾기 어려웠습니다,,
그래서 왜 발생한 것인지 한번 알아보았습니다.

gRPC-Core 392 issues
-> Implicit conversion loses integer precision 'uint64_t' (aka 'unsigned long long') to 'uint32_t' (aka 'unsigned int')

unsigned long long 타입인 uint64_t 를 unsigned int 타입인 uint32_t로 암시적 형변환을 하면 정수의 정확도를 잃는다고 하네요

잘 모르지만 64비트 크기를 32비트로 변환할 경우 당연히 정밀도가 떨어질 것이기 때문에 Xcode에서 이런 경고를 보내온 것 같습니다.

어디서 에러가 났는지 파악하기

이 경고를 처음 접했을때, SPM과 CocoaPod을 같이 사용하는 과정에서 발생한 건지, 코코아팟으로 받아온 다른 패키지에서 발생한 건지,,
정확히 어디서 문제가 발생한 것인지 제대로 인지하지 못했었어요...ㅠㅠ

이번에는 천천히 살펴보았습니다

gRPC-Core 라는 패키지에서 발생한 에러입니다.
근데... 저는 파이어베이스만 추가했거든요?? gRPC-Core는 뭐지??


gRPC 이외에도 abseii 라던지, boringssl 과 같은 생소한 패키지들이 추가되어 있었습니다. 경고가 발생한 gRPC만이라도 뭔지 알아봐야겠어요.

gRPC는 구글이 최초로 개발한 오픈 소스 원격 프로시저 호출 시스템이다. - 위키백과

구글이 개발한 오픈 소스 원격 프로시저 호출 시스템이 바로 gRPC이고, SPM을 통해 firebase-ios-sdk 를 받았더니 gRPC가 설치되었다...
구글에서 firebase에서 제공하는 오픈 소스들을 내 프로젝트로 전달하기 위해 설치했다.. 로 일단 이해하고 넘어갈게요

그래서 grpc 레포지토리도 한번 보고 왔습니다. 다양한 언어들과 ios, 안드로이드 등 여러 플랫폼을 지원하고 있는 것 같습니다. SPM과 코코아팟, 카르타고로 추가가 가능하네요.

2. 해결방법 구글링하기

형변환시 오차가 발생할 수 있다는 이러한 경고를 어떻게 해결해야될까요?
패키치를 직접 수정하는것은 아닐 것이고, Xcode에 문제가 있는 것 같아요.
팀원의 경우 이런 문제 없이 제대로 빌드되더라구요,,

대다수의 에러에 대한 해결책은 구글센세, 또는 스택오버플로에서 많이 찾아볼 수 있죠. 아무것도 몰랐던 상태에서 찾았던 첫번째 방법입니다.

첫번째 방법

Personally, I don't like seeing these third-party library warnings in my Xcode. I usually keep my build clean and so whenever some warnings or errors pop up in that pane, I know these warnings/errors are real and should be fixed before I push the PR.
Anyway, you can get rid of these warnings by simply adding this line in your Podfile and doing pod install again with this new config

inhibit_all_warnings!

이 내용을 Podfile에 추가하면, 해당 Podfile에 포함된 라이브러리에서의 경고를 무시하게 되겠네요!
처음에는 이 글을 보고 똑같이 추가해주었는데, 그래도 경고들은 여전히 그대로였습니다...
지금은 이해가 되죠ㅠㅠ
저희는 SPM을 통해서 firestore를 추가해줬으니, Podfile이 아닌 다른 곳에 명시되어 있는 패키지의 경고를 무시할 일은 없겠죠,,

그리고 지금 생각해보니, 코코아 팟을 통해 추가한 SwiftLint가 정작 프로젝트에서 동작하지 않은 이유가 여기에 있는 것 같네요(SwiftLint는 무관하게 잘 나오네용😂)

두번째 방법

This problem solved in my project by click File -> Resolve Package Versions:

Xcode File -> Packages -> Resolve Package Versions 을 누르면 해결됩니다.

간단하네요?? 근데 이렇게 해도 안되더라구요... 왜ㅠㅠ

CocoaPods은 조금 알았지만 SPM은 어떤 방식으로 프로젝트 의존성을 관리하는지 잘 몰랐어서, 먼저 이 Resolve Package Versions가 어떤건지 알아봐야겠어요

3. SPM 이해하기

philip님께서 정리해주신 내용을 토대로 이해해보았습니다.

1. SPM을 통해 추가한 패키지의 정보는 Package.resolved 파일에 추가됩니다.

Paackage.resolved프로젝트의 workspace에서 확인할 수 있어요.

workspace - xcshareddata - swiftpm 경로에 Package.resolved 파일이 보이네요.

이거 완전... CocoaPod의 Podfile.lock 이네요. 패키지의 주소와 버전 등이 명시되어 있습니다. Podfile.lock 처럼 프로젝트 패키지들의 버전들을 명시해주는 것 같아요.

2. SPM을 통해 추가한 패키지는 Derived Data에 저장됩니다.

프로젝트 디렉토리 내 Pods 라는 폴더에 저장되는 CocoaPod이랑 다르네요!
Derived Data는 Xcode 디렉토리에 위치하고 있습니다.
Xcode에서 위에 표시된 부분을 우클릭하면, 경로를 확인할 수 있어요.
Xcode - DerivedData - 프로젝트명 - SourcePackages에 SPM에서 추가한 패키지들이 저장되어있습니다.

DerivedData는 정확히 어떤 것들이 포함될까요?

종종 Xcode에서 알 수 없는 에러가 발생했을때 DerivedData를 삭제해주곤 했는데요.
DerivedData는 프로젝트를 빌드하면서, 빌드 파일들을 저장하는 곳입니다. 처음 빌드할 때 저장해놓고, 다음에 빌드할때는 저장된 빌드 정보를 캐싱함으로써 효율인 빌드가 가능해지는거죠.
DerivedData에 가보면 프로젝트마다 폴더가 하나씩 생성되어 있는것을 볼 수 있습니다. 빌드에 대한 정보들은 Build 폴더에 저장되고, 패키지들은 SourcePackages 라는 폴더에 저장됩니다.

클린빌드(⇧ + ⌘ + K)를 하게되면 DerivedDataBuild 폴더만 지워집니다.

여기까지 이해하고, Resolve Package Versions 가 어떤 역할을 하는지 봐야겠죠.
Xcode에서 제공하는 기능인 Resolve Package VersionsPackage.resolve에 명시된 패키지 정보대로 강제로 패키지를 다시 받는 기능입니다. pod install과 동일한 기능을 하는 것 같아요.

나머지 두 기능도 한번 확인해보면,
Reset Package Caches
Derived data의 패키지 캐시를 삭제하고 패키지를 다시 불러온다.

Update to Last Package Versions
패키지를 가장 최신 버전으로 업데이트한다. 이건 pop update 같네요..

즉, 2번 방법의 경우 Resolve Package Versions을 하게되면 Package.resolve에 명시된 패키지 정보대로, Derived Data에 저장된 Package들을 갱신하게 됩니다.

저는 왜 안될까요?
그래서 아래의 순서로 진행했더니 끝내 경고가 사라졌습니다ㅠㅠ

  1. Resolve Package Versions을 하고 빌드한다 -> 안됨
  2. Derived Data를 삭제하고 빌드한다 -> 안됨
  3. 다시 Resolve Package Versions을 하고 빌드한다 -> 드디어 됨

패키지가 Derived Data에 저장되기 때문에, Derived Data를 지우면 패키지들도 지워지면서 문제가 해결되지 않을까라는 생각이 들었습니다. 원래 1번만 해도 되는게 정상인 것 같은데 정확한 이유는 잘 모르겠습니다ㅠ 어쨋든 패키지를 싹 정리하고 다시 처음부터 진행하니까 경고는 사라졌어요.

SPM으로 패키지를 받아오면서 발생한 경고가, 왜 Resolve Package Versions을 하니까 사라지는지도 잘 모르겠어요. Package.resolve도 결국 패키지 받아올때 생성된 것 아닌가요?? ... 나중에 알게되면 추가하도록 하겠습니다

4. 마무리

저 수많은 경고들을 처음 마주쳤을때는 많이 당황했습니다. 여느때처럼 무지성으로 경고문을 복붙해서 검색해보고, 끝내 해결못하고 뒤로 미뤘었는데...
이렇게 조금이라도 이해하면서 진행하니까 문제도 해결되고 SPM으로 의존성을 추가하는 방식, Xcode가 빌드파일 및 패키지를 어떻게 관리하는지 조금 알게된 것 같습니다.

앞으로 라이브러리 관련해서 문제가 발생했을때 이렇게 먼저 시도해보려고 해요.

1. 클린빌드한다(국롤)

클린빌드하면 Xcode-DerivedData-Build 파일이 삭제되고, 빌드하면서 발생한 문제라면 해결될 수도 있겠죠??

2. Reset Package Caches을 한다

패키지 캐시를 한번 리셋해보고...

3. Resolve Package Versions

Package.resolved 에 명시된 패키지 정보를 토대로 패키지들을 다시 받아옵니다.
특히 협업을 진행하는 경우 패키지의 버전을 통일할때 Resolve Package Versions을 해주면 되겠네요. 코코아팟의 경우 처음에 pod install 하는 것처럼...

4. 이래도 안되면 Derived Data의 해당 프로젝트 폴더를 삭제하고 다시 진행한다.

Derived Data 자체를 삭제할 경우, 다른 프로젝트들도 다시 빌드해야되기 때문에 이를 원치 않는다면 해당하는 프로젝트 폴더만 삭제하는게 좋겠죠? 빌드파일 뿐 아니라 SPM으로 추가한 패키지들도 여기에 저장된다는 것을 알았으니, 정 안되면 Derived Data를 지워보도록 하려구요.

그래도 안된다면 다시 구글링을...

잘못된 내용, 틀린 정보가 있을 수 있으므로 언제든 지적 부탁드립니다.

참고:

profile
iOS dev / Japanese with Computer Science

0개의 댓글