iOS 앱 프로젝트를 진행하다가 문제가 생겼다.
.xcconfig 파일을 사용하는 과정에서 CocoaPods와 관련된 문제가 발생한 것.
우선 이 프로젝트는 다음과 같이 개발 환경이 설정되어있다.
바로 적용하여 배포하려는 버그 패치나 기능 개선 등은 소스 코드에 적고, 개발용 앱에는 새로 개발중인 기능 등을 포함한다.
Swift에는 Target별로 커스텀 Compiler Flag를 지정할 수 있다.
(Xcode의 최상단 프로젝트 파일>각 Target>Build Settings>Swift Compiler - Custom Flags)

커스텀 컴파일러 플래그를 지정할 때는 -D prefix를 붙여 사용해야 한다.
(🔗 관련 링크1, 🔗 관련 링크2)

이렇게 타겟별로 커스텀 플래그를 지정하여 타겟별로 컴파일을 분기처리할 수 있다.
이러면 개발용 앱(Target)에만 포함해야 하는 코드들(신규 기능 등)을 별도 브랜치로 관리하지 않고 같은 파일 내에서 편하게 관리할 수 있다는 장점이 있다.
.xcconfig 파일에 담아서 저장한다. 이때 배포용 Target은 배포용 config 파일, 개발용 Target은 개발용 config 파일을 각각 사용한다. 그래서 Xcode의 Configuration 항목에서 Debug, Release의 하위 타겟들에 각각에 맞는 .xcconfig 파일들을 할당하려고 했는데, 문제가 생겼다..
다음과 같은 경고문이 뜨며 빌드 에러가 난다...!!
❌ Unable to load contents of file list: '/Target Support Files/Pods-프로젝트이름/Pods-프로젝트이름-frameworks-Debug-input-files.xcfilelist'
Target Support Files 는 Pods 안에 존재하는 폴더이다.
코코아팟과 관련된 문제인 것 같았다.
CocoaPods에서 생성하는 .xcconfig 파일이었다.CocoaPods에 대해 좀 더 찾아보던 중에, 새로운 사실을 알게 되었다.
프로젝트 내에서 CocoaPods를 이용하여 라이브러리를 사용하면,
프로젝트 내의 각 Target의 Configuration 파일들이 Pod.xcconfig 파일들로 자동으로 설정된다는 점이다.
(정확히는
Pods-프로젝트이름.debug.xcconfig,
Pods-프로젝트이름.release.xcconfig
라는 이름으로 생성되는데, 편의상 이 파일들을 Pods.xcconfig라고 하겠음.)

(🔗 위 사진은 CocoaPods Guide 중 일부)
프로젝트 내에서 CocoaPods을 설치하면 CocoaPods에서 직접 Xcode configuration file(.xcconfig)을 생성하고, 프로젝트의 각 target configuration에 이를 할당하는 것 같다.
그래서 내가 직접 설정한 .xcconfig 파일들을 각 Target에 설정하기 전에 아마 이 Pods.xcconfig 파일들이 설정되어있을 것이고, 이 설정이 바뀌면서 CocoaPods 내부에서 적절한 파일을 불러올 수 없는 것 같았다.
위에서 언급한 에러 메시지를 바탕으로 구글이나 생성형 AI에 검색해보면 대부분 터미널에 다음과 같이 입력하라고 뜬다.
pod deintegrate
pod install
그러나 지금과 같은 경우는 해결이 되지 않는다. (pod install만 열 번 넘게 한 듯;;...)
왜냐하면 (당연하지만) pod 을 재설치하고 다시 내가 만든 .xcconfig 파일을 할당하면 다시 같은 문제가 반복되어버리기 때문...
처음에는 이걸 어떻게 해결해야 하나 싶었다.
"내가 만든
.xcconfig파일하고CocoaPods에서 직접 만든.xcconfig파일을 동시에 적용할 수 있는 방법이 없나?"
근데 생각보다 해결책은 간단했음!
해결책을 알기 위해서 Xcode Configuration을 설정하는 방법에 대해 알면 도움이 된다.
Xcode 프로젝트에 Build Configuration을 추가하는 방법에 대해서는
🔗 이 Xcode Article 를 참고.
이 중에서 지금 필요한 내용은 🔗 Map build settings to a build configuration 에 관련 내용이 잘 설명되어 있다.

내용인 즉슨,
"Xcode에서 Build Configuration은 Debug, Release 빌드에 따라 다르게 설정할 수 있고, 다른 설정 위에 계층적으로 구성 파일을 지정할 수도 있다"
즉, 기본적으로 Debug, Release 빌드를 구분하는 서로 다른 두 base configuration을 설정할 수 있고,
각 빌드의 하위 항목(각 타겟들)들에도 이 base configuration에 더해 추가로 configuration을 설정할 수 있다는 말.

여기에 더해서, Xcode는 빌드 설정을 적용할 때
프로젝트 설정 -> 빌드 구성 파일의 설정 -> 타겟 설정
순서로 설정을 적용한다고 한다.
설정 순서에 대한 보다 자세한 사항은
🔗 이 글 참고
CocoaPods에서 생성한 .xcconfig 파일들은 debug, release 별로 구분되어 생성되기 때문에, 각 Target들의 configuration으로 설정되었던 Pods.xcconfig들을 Debug, Release 의 Base Configuration으로 지정할 수 있고,
각 타겟의 Configuration들에는 내가 설정하고자 하는 API Key와 같은 정보가 담긴 .xcconfig 파일로 설정할 수 있다.
그러면 각 Target은 (Debug/Release Configuration 중 1) + (각 Target 별로 설정된 .xcconfig) 두 개의 configuaration을 모두 적용할 수 있게 된다.

위 그림은 예시 이미지인데, 위에서 빨간색으로 표시된 부분에 Pods.xcconfig 파일을, 파란색으로 표시한 부분에 각 Target에 맞게 내가 만든 .xcconfig 파일을 설정하면 문제없이 빌드되는 것을 확인할 수 있다.
(우리 프로젝트에서는 Target을 하나 더 만들었으므로 파란색 상자가 총 4개가 되는 것!)
^____^