
TCA로 토이 프로젝트의 초반 코드를 작성하던 중 아래와 같은 에러를 마주쳤다. 원인을 찾는 과정과 해결 방법을 기록해둔다.
import ComposableArchitecture
@Reducer
struct Login {
@ObservableState
struct State {
}
enum Action {
case login
}
}
이렇게 아주 단순한 코드에서도 다음과 같은 에러가 떴다.
External macro implementation type
'ComposableArchitectureMacros.ReducerMacro' could not be found for
macro 'Reducer()'; No such file or directory
당시 환경은
찾아보니 이건 TCA 자체의 버그가 아니라, Xcode의 SourceKit(에디터 내부 실시간 진단 도구)이 매크로 확장을 제대로 따라가지 못해서 생기는 Xcode 쪽의 표시 오류였다.
swift-composable-architecture 저장소의 디스커션에서 동일한 증상이 반복적으로 보고되어 있었고, 실제로 빌드는 정상적으로 성공하는데 에디터에만 빨간 줄이 계속 남아있는 경우가 대부분이었다.
1. Issue Navigator에서 매크로를 Trust & Enable 했다
Issue Navigator를 열어보니 매크로 관련 경고가 떠 있었다. Trust & Enable을 눌러 신뢰를 활성화했다.
ComposableArchitectureMacros라는 같은 플러그인 안에 여러 매크로(ReducerMacro, ObservableStateMacro 등..)가 들어있다 보니, Xcode가 뜨는 경고를 하나씩 발견할 때마다 개별적으로 신뢰를 걸어줘야 하는 것으로 보였다.
그런데 여전히 에러가 남아있었다.
2. 그래도 빨간 줄이 남아 있길래 일단 빌드(⌘R)해봤다
에디터에는 여전히 빨간 줄이 남아있었지만, 밑져야 본전이라는 생각으로 그냥 ⌘R로 실행해봤다. 그랬더니 빌드가 정상적으로 성공하고 앱도 문제없이 실행됐다. 에디터에 뜬 에러는 실제 컴파일 결과와는 무관한, SourceKit만의 표시 오류였던 것이다.
혹시 이 두 단계로도 안 풀린다면 시도해볼 것들
캐시가 꼬여있는 경우일 수 있으니 아래를 순서대로 시도해본다.
File → Packages → Reset Package Caches
File → Packages → Resolve Package Versions
Product → Clean Build Folder (⌘⇧K)
그래도 안 되면 ~/Library/Developer/Xcode/DerivedData를 삭제하고 Xcode를 완전히 재시작한다. 또한 Debug/Release가 아닌 커스텀 Build Configuration을 쓰고 있다면 그것이 원인이라는 보고도 많으니, 가능하다면 기본 Debug/Release 조합으로 되돌려서 확인해본다.
에디터의 빨간 줄만 보고 당황했지만 실제로는 정상 빌드되는 SourceKit 표시 버그였다. 앞으로 비슷한 에러를 만나면 당황하지 말고 우선 빌드/실행부터 시도해볼 것.