해당에러는 출시 프로젝트에 위젯을 추가하려고 했을때 발생 하였던 에러입니다.
위젯을 추가 하기만 하면 위와 같은 문구가 나오며 문제가 발생 하게 되었습니다.
해당 에러의 핵심은
Xcode 빌드 중 의존성 사이클(순환 참조) 가 발견
되고 있음을 말합니다.
하지만 그저 위젯을 임베드 했다고 해서 해당 문제가 발생한다면 정말 이상할수 없습니다.
인터넷에 있는 해결방법을 모아 보았었는데
- 클린 빌드로 해결해 보세요 → X
- DerivedData 를 지우고 해보세요 → X
- 타겟 멤버쉽 미리 세팅 → X
- The application's Info.plist does not contain a valid CFBundleVersion. Ensure your bundle contains a valid CFBundleVersion.
위의 과정처럼 계속해서 또 다른 문제를 만들기만 하지 해결을 해주 못하였습니다.
Xcode의 빌드 단계
빌드 잡업 순서는 의존성 정보( Dependency Information ) 에 따라 결정 되는데
의존성 정보는 작업, 입력, 출력 등에 따라 결정 되게 됩니다.
해당 이미지 처럼 링크 작업이 이루어 지면서
실행 파일을 만들기 위해 이전 작업들에 의존하는 관계가 형성 됩니다.
즉 빌드 시스템은 이런 의존성 정보를 통해 어떤 작업을 먼저 실행 할지 경정하고, 그 중에 어떤 작업을 병렬로 처리할지 결정하는 것들등 의존성 순서 ( Dependency Order ) 라고 합니다.
다시 돌아와서 문제를 어떻게 해결해야 하냐면
위의 사진 과 같이 빌드 단계를 “Run Script” 위에 Embed Foundation 으로 위치를
변경 해주면 해당 문제는 해결됩니다.. 간단하죠?
왜 해당 문제가 발생 하였을까
각 단계가 서로의 출력을 입력으로 의존 관계가 맺어
지게 될것인데
스크립트 실행 단계
에서임베드 프레임 워크 단계
의 결과에 의존하고 있었을 가능성이 커 보인다.
즉 임베드 프레임 워크 단계를
스크립트 실행
단계의 위 즉 먼저 하게 이동함으로,
모든 프레임 워크가 스크립트 실행전에 적절히 임베드 되어 스크립트가 의존하는 조건이 충족 되었기에
해당 문제는 해결이 된것이다.
위젯을 처음으로 도입하면서 자주 사용하고 있던 XCode 였지만
정작 빌드 순서를 이해 하지 못하고 사용하고 있었던 저를 돌아볼수 있었습니다.
아직 여기서 더 Deep한 내용들이 많지만, 기회가 된다면 조금더 세부적으로 다뤄 보도록 하겠습니다.