ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 사용하시면서 프로젝트 설정부터 전부 처리해야되니 쉽게 사용되었던것도 다시 한번 돌아보는 경험이 되는것 같습니다👍

Designed by Tistory.