-
Multiple commands 에러 바로잡기 (feat. GoogleService-Info.plist)Tuist 2023. 5. 4. 13:41
안녕하세요. 그린입니다🍏
이번에는 간혹 한번쯤 보셨을 Multiple commands 에러에 대해 파악해보고 바로잡는 실무에 가까운 포스팅이 될 것 같아요🙋🏻
우선, 저는 Tuist를 통해 프로젝트를 구성하고 생성해주는데 이때 Prod / Dev / QA 총 3개로 타겟 및 스킴을 나누고 워크스페이스를 구성해줍니다.
요 경우에 entitlement 파일이라던지 아니면 흔히 사용되는 Firebase의 config 설정을 위해 GoogleServiceInfo.plist 파일을 구성해주고 리소스에 심어주게 되는데요.
이때 리소스 폴더 내 각 총 3개의 GoogleServiceInfo.plist 파일이 생기고 이를 리소스로 동일하게 가져가려하니 에러가 납니다.
그래서 이번 포스팅에서는 GoogleServiceInfo.plist 파일을 가지고 예시로 설명하며 에러를 잡아볼까 합니다🙌
좀 더 자세히 왜 발생하는지부터 보시죠!
Multiple commands 에러?
만약 아래와 같이 프로젝트를 구성하는 폴더 구조가 있다고 가정해볼께요.
자 보시면 프로젝트와 같은 경로에 Resources 폴더가 존재하고 그 내부에 각 타겟별로 입혀줄 QA / PROD / DEV 폴더가 존재합니다.
이 폴더에는 GoogleService-Info.plist 파일들이 공통적으로 들어있어요.
그랬을때 우리는 Tuist를 사용해 리소스에 해당 리소스 하위 경로 폴더 및 파일들을 모두 지정해주게 되죠?
그렇다면 GoogleService-Info.plist 파일들이 QA / PROD / DEV에 모두 들어가게 되니 multiple commands 에러가 발생하는 겁니다.
즉, Build Phases에서 Copy Bundle Resources를 보시면 해당 파일들이 충돌나게 되는걸 볼 수 있어요.
그래서 아래와 같이 multiple commands 에러를 내뱉는겁니다🙋🏻
그렇다면 이걸 어떻게 해결할 수 있을까요?
Multiple commands 에러 해결하기
우선 가장 간단한 방법은 Copy Bundle Resources에서 해당 중복된 파일을 제거하는겁니다.
다만 문제는 Tuist로 구성했을때 프로젝트를 생성하는 시점에서 다시 또 중복이 일어나게 되니 좋은 방법은 아닐거에요🥹
그럼 우리는 Tuist로 프로젝트 설정 및 구성을 한다는 가정하에 Tuist에서 해결해줘야 합니다🕺🏻
tuist edit으로 해당 프로젝트 타겟을 나누고 만들어지는 코드로 가보겠습니다.
각자의 프로젝트 타겟 생성하는 코드에서 resources 부분만 보면 됩니다.
여기서 PROD / DEV / QA 타겟으로 나눠졌다면 해당하는 폴더 경로의 GoogleService-Info.plist만 사용하고 나머지는 예외처리 시키면 됩니다.
코드로 보시죠!
// PROD 타겟 시 resources 설정 부분 resources: [ .glob( pattern: "Resources/**", excluding: ["Resources/DEV/**", "Resources/QA/**"] ) ] // DEV 타겟 시 resources 설정 부분 resources: [ .glob( pattern: "Resources/**", excluding: ["Resources/PROD/**", "Resources/QA/**"] ) ] // QA 타겟 시 resources 설정 부분 resources: [ .glob( pattern: "Resources/**", excluding: ["Resources/DEV/**", "Resources/PROD/**"] ) ]
참 쉽죠?!
excluding 옵션을 사용해 해당하는 타겟이 아닌 대상의 폴더는 무시하도록 설정해줍니다.
요러면 각자 타겟마다 중복되지 않고 GoogleService-Info.plist 파일이 각 타겟에 맞는 하나씩 들어가게 되고 에러를 해결할 수 있습니다.
예전에는 타겟마다 공통적으로 돌 빌드 스크립트에서 GoogleService-Info-(PROD/DEV/QA).plist 파일을 구성하고 이를 판단해주고 심어주도록 했는데 귀찮게 빌드 스트립트를 더 구성할 필요없이 편리하게 가져갈 수 있더라구요😲
마무리
항상 Xcode 설정에서 나는 에러는 단순하지 않은 부분들도 많아 어렵네요ㅎㅎ..
특히 Tuist를 사용하시면서 프로젝트 설정부터 전부 처리해야되니 쉽게 사용되었던것도 다시 한번 돌아보는 경험이 되는것 같습니다👍
'Tuist' 카테고리의 다른 글
Tuist v4 설치 및 사용 (with. 자동화) (64) 2024.07.01 Tuist의 Configuration 설정하기 (19) 2023.05.18 Tuist에서 Firebase Crashlytics 설정하기 (15) 2023.04.27 Tuist를 통해 SwiftLint 사용하기 (10) 2023.04.25 Tuist - Custom Flags 다루기 (6) 2023.04.18