cycle inside building could produce unreliable results 누구냐 넌... ( ง⁼̴̀ω⁼̴ )ง⁼³₌₃

김재형·2024년 5월 19일
0
post-custom-banner

cycle inside building could produce unreliable results

해당에러는 출시 프로젝트에 위젯을 추가하려고 했을때 발생 하였던 에러입니다.
위젯을 추가 하기만 하면 위와 같은 문구가 나오며 문제가 발생 하게 되었습니다.

해당 에러의 핵심은 Xcode 빌드 중 의존성 사이클(순환 참조) 가 발견되고 있음을 말합니다.
하지만 그저 위젯을 임베드 했다고 해서 해당 문제가 발생한다면 정말 이상할수 없습니다.

의존성 사이클이 발생할수 있는 경우

  • 두 개 이상의 모듈이 서로를 직접 또는 간접적으로 참조할 때
  • 스크립트에서 사용하는 파일이 아직 생성되지 않았을 때
  • 잘못된 빌드 설정으로 인해 특정 단계가 여러 번 실행될 때

인터넷에 있는 해결방법을 모아 보았었는데

  • 클린 빌드로 해결해 보세요 → X
  • DerivedData 를 지우고 해보세요 → X
  • 타겟 멤버쉽 미리 세팅 → X
  • The application's Info.plist does not contain a valid CFBundleVersion. Ensure your bundle contains a valid CFBundleVersion.

위의 과정처럼 계속해서 또 다른 문제를 만들기만 하지 해결을 해주 못하였습니다.

XCode 빌드 프로세스를 이해해 보자

Xcode의 빌드 단계

  • 전처리 단계 → 컴파일러에 제공 가능한 방식으로 프로그램 변환
  • 컴파일 소스 → 소스 코드르 컴파일 단계
  • 임베드 프레임 워크 → 필요한 프레임 워크를 앱 번들에 포함 시키는 단계
  • 소스 복사: 이미지, 데이터 등 앱 번틀로 복사 하는 단계

  • 스크립트 실행 → 사용자 정의 스크립트를 실행 하는 단계

빌드 작업순서는 누가 정하는거죠?

빌드 잡업 순서는 의존성 정보( Dependency Information ) 에 따라 결정 되는데
의존성 정보는 작업, 입력, 출력 등에 따라 결정 되게 됩니다.

해당 이미지 처럼 링크 작업이 이루어 지면서
실행 파일을 만들기 위해 이전 작업들에 의존하는 관계가 형성 됩니다.
즉 빌드 시스템은 이런 의존성 정보를 통해 어떤 작업을 먼저 실행 할지 경정하고, 그 중에 어떤 작업을 병렬로 처리할지 결정하는 것들등 의존성 순서 ( Dependency Order ) 라고 합니다.

그래서 문제는 어떻게 해결해야 하나

다시 돌아와서 문제를 어떻게 해결해야 하냐면

위의 사진 과 같이 빌드 단계를 “Run Script” 위에 Embed Foundation 으로 위치를
변경 해주면 해당 문제는 해결됩니다.. 간단하죠?

왜 해당 문제가 발생 하였을까
각 단계가 서로의 출력을 입력으로 의존 관계가 맺어 지게 될것인데
스크립트 실행 단계 에서 임베드 프레임 워크 단계 의 결과에 의존하고 있었을 가능성이 커 보인다.

즉 임베드 프레임 워크 단계를 스크립트 실행 단계의 위 즉 먼저 하게 이동함으로,
모든 프레임 워크가 스크립트 실행전에 적절히 임베드 되어 스크립트가 의존하는 조건이 충족 되었기에
해당 문제는 해결이 된것이다.

마무리 하며

위젯을 처음으로 도입하면서 자주 사용하고 있던 XCode 였지만
정작 빌드 순서를 이해 하지 못하고 사용하고 있었던 저를 돌아볼수 있었습니다.
아직 여기서 더 Deep한 내용들이 많지만, 기회가 된다면 조금더 세부적으로 다뤄 보도록 하겠습니다.

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글