TUIST 뿌시기 4

Ios_Roy·2025년 7월 29일

TUIST뿌시기

목록 보기
4/6
post-thumbnail

07.29(화)

제가 이해하고 공부 한대로 작성한 내용이다 보니 , 정확한 정보가 아닐수도 있습니다
고쳐야 할 부분이 있다면 , 편하게 애기 해주시면 감사 하겠습니다🙏🏻

🛠 Tuist Settings 설정 구성

Tuist에서 Settings.swift는 프로젝트 또는 모듈별 빌드 설정을 관리하는 핵심 파일입니다.
이 파일을 통해 .xcconfig, 빌드 설정, 서명 정보 등을 코드 기반으로 선언하고 재사용할 수 있습니다.

Tuist의 설정은 SettingsDictionary를 중심으로 구성되며, 공통 설정과 환경별 설정(Debug, Release 등)을 나누어 체계적으로 관리할 수 있는 것이 특징입니다.

🔧 commonSettings 함수 설명

commonSettings 함수는 앱 타겟의 공통적인 설정 값을 하나의 함수로 추출하여
반복을 줄이고 유지보수를 쉽게 하기 위한 유틸 함수입니다.


📌 목적

  • 각 빌드 환경(Debug, Stage, Release 등)에서 중복되는 설정 항목을 재사용하기 위해 사용됩니다.
  • 특히 앱 이름, Display Name, Provisioning Profile, SkipInstall 여부 등은 환경만 다를 뿐,
    설정 키는 동일하기 때문에 함수를 통해 추상화하는 것이 효율적입니다.

🧩 설정 대상

항목설명
PRODUCT_NAME실행 파일 이름
CFBundleDisplayName홈 화면에 표시될 앱 이름
Provisioning Profile서명에 사용할 프로파일 지정 (match와 연계 가능)
-ObjC, -all_loadObjective-C 런타임, 클래스 카테고리 로딩을 위한 링커 플래그 설정
dwarf-with-dsym디버그 심볼 파일 포함 (.dSYM 생성을 통해 crash 추적 가능)
SKIP_INSTALL = YES/NO아카이브 대상 포함 여부 설정

💡 왜 사용하는가?

  • GUI 설정은 추적이 어렵고 사람이 누락하기 쉬움 → 코드 기반 설정으로 명시적 관리 가능
  • 환경별 설정은 달라도 키는 동일하므로 추상화를 통해 코드 중복 제거
  • 다수 모듈 or 다중 앱 타겟에서 설정 누락 방지 및 유지보수 간편화

🔄 이 함수와 연계되는 곳

  • Settings.appMainSetting 설정 내부의 configurations 항목에 적용됩니다.
  • 예: .debug, "Stage", .release, "Prod" 등의 빌드 환경에서 공통 설정을 빠르게 주입
  • CI/CD 환경에서도 안정성과 일관성 확보를 위해 이와 같은 추상화는 필수입니다.

private static func commonSettings(
  appName: String,
  displayName: String,
  provisioningProfile: String,
  setSkipInstall: Bool
) -> SettingsDictionary {
  return SettingsDictionary()
    .setProductName(appName)
    .setCFBundleDisplayName(displayName)
    .setOtherLdFlags("-ObjC -all_load")
    .setDebugInformationFormat("dwarf-with-dsym")
    .setProvisioningProfileSpecifier(provisioningProfile)
    .setSkipInstall(setSkipInstall)
}

✅ 주요 설정 항목

설정 메서드설명
setProductName(appName)Xcode 프로젝트의 타겟 이름 설정 (PRODUCT_NAME)
setCFBundleDisplayName(displayName)앱의 홈화면에 표시될 이름 설정 (CFBundleDisplayName)
setOtherLdFlags("-ObjC -all_load")Objective-C 런타임과 모든 오브젝트 로딩 설정
setDebugInformationFormat("dwarf-with-dsym")디버깅 심볼 정보를 포함한 설정 (Debug Information Format)
setProvisioningProfileSpecifier(provisioningProfile)지정된 서명 프로파일 설정 (Provisioning Profile)
setSkipInstall(setSkipInstall)타겟을 아카이브 대상에서 제외할지 여부 (true일 경우 제외됨)

🛠 appMainSetting 설정 — 앱 전용 공통 빌드 구성

appMainSetting앱 실행 타겟을 위한 전역 설정 블록입니다.
Tuist에서는 이 설정을 통해 앱의 공통 빌드 속성과 환경별 세부 구성(Debug, Stage, Prod 등)을 한 곳에서 명확히 정의할 수 있습니다.


✅ 핵심 개념

  • base:는 모든 환경에 공통적으로 적용되는 빌드 설정값입니다.
  • configurations:.debug, "Stage", .release, "Prod"개별 환경에 맞는 커스텀 설정을 정의합니다.
  • 각 환경은 별도의 .xcconfig 파일을 통해 외부 설정도 병행할 수 있으며, Tuist의 SettingsDictionary()와 함께 선언적으로 관리됩니다.

🧩 왜 중요한가?

이유설명
명시적 설정Xcode GUI가 아닌 코드로 빌드 설정을 정의함으로써, 설정 변경 사항이 Git에 명확히 추적
환경별 분리Stage, QA, Release, Production 등 여러 환경을 사용할 때 설정 충돌 방지
재사용성공통된 설정(base)과 부분 설정(commonSettings)을 통해 DRY 원칙(중복 제거) 적용
CI/CD 적합빌드 설정이 선언적으로 정의되어 있어, 자동화 파이프라인에서 안정적으로 재현 가능

환경별 xcconfig 예시:

  • ./Config/dev.xcconfig
  • ./Config/qa.xcconfig
  • ./Config/realse.xcconfig
public static let appMainSetting: Settings = .settings(
  base: SettingsDictionary()
    .setProductName(Project.Environment.appName)                            // PRODUCT_NAME
    .setCFBundleDisplayName(Project.Environment.appName)                   // CFBundleDisplayName
    .setMarketingVersion(.appVersion())                                    // CFBundleShortVersionString
    .setASAuthenticationServicesEnabled()                                  // Apple 인증 활성화
    .setPushNotificationsEnabled()                                         // 푸시 권한 설정
    .setEnableBackgroundModes()                                            // 백그라운드 모드 허용
    .setArchs()                                                            // ARCHS
    .setOtherLdFlags()                                                    // 링커 설정
    .setCurrentProjectVersion(.appBuildVersion())                          // CFBundleVersion
    .setCodeSignIdentity()                                                // 코드서명 아이덴티티 설정
    .setCodeSignStyle()                                                   // 코드서명 방식: Automatic/Manual
    .setSwiftVersion("6.0")                                               // Swift 버전 설정
    .setVersioningSystem()                                                // 버전 시스템 설정
    .setProvisioningProfileSpecifier("match Development \(Project.Environment.bundlePrefix)")
    .setDevelopmentTeam(Project.Environment.organizationTeamId)
    .setCFBundleDevelopmentRegion()
    .setDebugInformationFormat(),                                         // Debug 정보 형식 설정
                                                                          
  configurations: [
    .debug(
      name: .debug,
      settings: commonSettings(
        appName: Project.Environment.appName,
        displayName: Project.Environment.appName,
        provisioningProfile: "match Development \(Project.Environment.bundlePrefix)",
        setSkipInstall: false
      ),
      xcconfig: .relativeToRoot("./Config/dev.xcconfig")
    ),
    .debug(
      name: "Stage",
      settings: commonSettings(
        appName: Project.Environment.appStageName,
        displayName: Project.Environment.appName,
        provisioningProfile: "match Development \(Project.Environment.bundlePrefix)",
        setSkipInstall: false
      ),
      xcconfig: .relativeToRoot("./Config/qa.xcconfig")
    ),
    .release(
      name: .release,
      settings: commonSettings(
        appName: Project.Environment.appName,
        displayName: Project.Environment.appName,
        provisioningProfile: "match AppStore \(Project.Environment.bundlePrefix)",
        setSkipInstall: false
      ),
      xcconfig: .relativeToRoot("./Config/realse.xcconfig")
    ),
    .release(
      name: "Prod",
      settings: commonSettings(
        appName: Project.Environment.appProdName,
        displayName: Project.Environment.appName,
        provisioningProfile: "match AppStore \(Project.Environment.bundlePrefix)",
        setSkipInstall: false
      ),
      xcconfig: .relativeToRoot("./Config/realse.xcconfig")
    )
  ],
  defaultSettings: .recommended
)

📋 appMainSetting 구성 요약 (상세 설명 포함)

항목설명활용 이유
setProductNamePRODUCT_NAME 설정 — 빌드 타겟의 실행 파일 이름을 지정합니다.빌드 결과물(exe)의 명확한 네이밍으로, 여러 앱/타겟이 존재할 때 식별 용이
setCFBundleDisplayName앱의 홈 화면에 표시될 이름 (CFBundleDisplayName)실제 디바이스에 표시되는 이름 설정 → 환경별 이름 변경에 유용 (예: Stage 빌드 시 "MyApp-Dev")
setMarketingVersionCFBundleShortVersionString 설정 — 사용자에게 노출되는 앱 버전 정보App Store 제출 및 사용자 확인용 마케팅 버전 관리
setASAuthenticationServicesEnabledApple 로그인 활성화 설정Apple Sign In 기능을 사용하는 앱의 경우 필수. 설정 누락 시 빌드 실패 가능
setPushNotificationsEnabled푸시 알림 권한 설정Firebase, APNs 등 푸시 기능을 사용할 때 필수 권한. 설정 없으면 푸시 불가
setEnableBackgroundModes백그라운드 기능 허용 (audio, fetch, location 등)백그라운드에서 데이터를 fetch하거나 위치 추적이 필요한 앱에 필수
setArchs아키텍처 설정 (ARCHS) — 일반적으로 arm64Universal 빌드 또는 시뮬레이터/실기기 지원 조합 제어 시 필요
setOtherLdFlags링커 플래그 설정 (예: -ObjC, -all_load)Objective-C 런타임 요소 사용 시 필수. 카테고리 미인식 오류 방지
setCurrentProjectVersion빌드 넘버 설정 (CFBundleVersion)CI/CD에서 자동 증가 시에도 사용되며, 마켓 업데이트 필수 항목
setCodeSignIdentity서명 인증서 지정 (iPhone Developer, iPhone Distribution)적절한 인증서 없을 경우 빌드/배포 모두 실패함
setCodeSignStyle코드 서명 방식 지정 (Automatic, Manual)팀 규모에 따라 수동 관리 또는 match 등 자동화 여부 결정 가능
setSwiftVersion("6.0")Swift 컴파일러 버전 지정팀 내 Swift 버전 통일을 강제하여 호환성 문제 방지
setVersioningSystem버전 관리 시스템 지정 (예: apple-generic)MARKETING_VERSION, CURRENT_PROJECT_VERSION 계산 방식 설정
setProvisioningProfileSpecifier프로비저닝 프로파일 지정 (예: "match Development com.myapp")match 또는 수동 프로파일 매핑 시 사용. 서명 오류 방지
setDevelopmentTeamApple Developer Team ID 설정다수의 팀이 있거나 공유 계정 사용 시 필수. 자동 설정 가능
setCFBundleDevelopmentRegion기본 지역화 언어 설정 (en, ko 등)앱 리소스의 지역화 초기 값 설정. 미설정 시 App Store 경고 가능
setDebugInformationFormat디버깅 정보 형식 지정 (dwarf-with-dsym).dSYM 생성 여부 결정. 크래시 리포트 추적/심볼화에 필수

📦 Configuration별 구성

구성 이름설정 값 요약설명
.debug개발용 설정 + dev.xcconfig개발 중 디버깅을 위한 환경으로, 로그 출력, 테스트 서버 접근, 디버깅 심볼 포함 등의 설정이 적용됩니다. 앱 아이콘/이름에 "Dev" 또는 "-Debug"가 붙는 경우가 많습니다.
"Stage"스테이징 설정 + qa.xcconfigQA 및 내부 검증용 환경입니다. 실제 운영 API와 거의 동일하게 구성되지만, 안정성 테스트나 UAT(User Acceptance Test) 용도로 분리됩니다. 빌드 타겟명에 -Stage를 붙여 사용합니다.
.release릴리즈 설정 + realse.xcconfigApp Store 등록용 빌드를 위한 구성입니다. 최적화가 활성화되며, 디버깅 정보는 줄어듭니다. 하지만 일반적으로 내부에서 사용하는 실제 배포는 "Prod"를 사용합니다.
"Prod"프로덕션 설정 + realse.xcconfig최종 배포 환경을 위한 별도 스킴입니다. .release와 동일한 xcconfig를 사용하지만, 타겟 이름이나 DisplayName, 앱 아이콘 등을 구분할 수 있도록 구성됩니다.

💡 StageProd.debug, .release처럼 Tuist 기본 enum이 아니기 때문에 문자열로 직접 지정해야 합니다

활용 팁

  • ProdRelease를 분리하는 이유
    → 보통 CI 파이프라인을 분리하거나, 운영/스토어 배포를 이중 분기하기 위함입니다.
    예를 들어: release는 내부 테스트용, prod는 실제 App Store 제출용으로 나누어 사용합니다.

  • Stage는 QA팀 또는 고객사 테스트용으로 사용
    → 기기 등록이 별도로 필요하거나, QA 서버 연동을 위한 스테이징 환경으로 활용됩니다.
    일반적으로 앱 이름 뒤에 -Stage와 같은 표시를 붙여 시각적으로 구분합니다.

  • 환경 변수는 .xcconfig 파일로 관리
    dev.xcconfig, qa.xcconfig, realse.xcconfig 등의 외부 파일에
    API Key, 서버 주소, 버전, Feature Flag 등을 선언하여
    환경별로 분기 처리 및 보안 관리를 할 수 있습니다.

💡 xcconfig는 Git에서 .gitignore로 제외하거나, 암호화된 저장소에서 관리하는 것이 좋습니다.

✅ Tuist Settings 구성 완전 정복 — 공통 설정부터 환경 분리까지

iOS 대규모 프로젝트를 운영하다 보면, 환경별로 서로 다른 설정을 요구하거나
팀원 간 빌드 설정이 엇갈려 생기는 문제들이 종종 발생합니다.
이럴 때 Tuist의 Settings.swift를 활용하면 빌드 설정을 코드로 선언하고,
공통 설정과 환경별 설정을 구조화하여 안정성과 생산성을 높일 수 있습니다.


📌 핵심 요약

항목설명
공통 설정 추출commonSettings() 함수를 통해 환경별로 중복되는 설정을 한 번에 관리
코드 기반 설정 선언GUI 설정이 아닌 코드 기반으로 설정을 선언 → Git으로 추적 가능
코드서명/프로파일 분리각 환경에 맞게 Provisioning Profile, Team ID 등을 정확하게 분리
환경별 설정 명확화.debug, "Stage", "Prod", .release로 빌드 구성을 명확히 구분
외부 파일(xcconfig) 연동dev.xcconfig, qa.xcconfig 등을 통해 민감한 설정 파일 관리 가능
CI/CD 적합 구조선언형 + 명시적 설정으로 자동화 환경에서도 안정적 빌드 재현 가능
중복 제거 + 명시성 확보설정 누락 방지, 팀원 간 설정 일관성 유지에 매우 유리

💡 적용 시 이점

  • 빌드 설정이 명시적으로 드러나 누가 언제 어떤 변경을 했는지 추적 가능
  • 환경 추가가 필요해도 기존 구조를 재사용하면 설정 실수 없이 확장성 확보
  • CI/CD 자동화 시 .xcconfigSettingsDictionary일관된 결과물 보장
  • 팀 전체가 공통된 빌드 기준을 공유할 수 있어 커뮤니케이션 비용 절감

추천 사용 흐름

  1. commonSettings()로 공통 설정 추출
  2. appMainSetting에서 base + configurations 설정 분리
  3. dev.xcconfig, qa.xcconfig, realse.xcconfig 등 외부 설정 파일 활용
  4. Settings.settings(...)를 각 모듈에서 적절히 불러와 재사용


✅ 결론

Tuist의 Settings.swift를 활용하면 Xcode의 GUI 설정에서 발생할 수 있는
비일관성, 추적 불가능한 변경, 환경별 설정 충돌 문제를 코드 기반으로 해결할 수 있습니다.

특히 다음과 같은 상황에서 효과를 극대화할 수 있습니다:

  • 여러 환경(Stage, Prod, QA 등)을 병행 운영해야 할 때
  • 팀 내 빌드 설정 기준을 통일하고자 할 때
  • CI/CD 파이프라인을 안정적으로 구성하고자 할 때
  • 모듈이 많아지고 설정이 복잡해질수록 반복을 줄이고 싶을 때

명시성, 재사용성, 안정성이라는 세 가지 키워드를 갖춘 Settings.swift 구조는
프로젝트 규모가 커질수록 더욱 강력한 무기가 되어 줄 것입니다.

📌 단순히 빌드 설정을 넘어서, 팀 전체의 개발 문화를 "코드 중심"으로 전환하는 데 큰 기여를 합니다.


👀 다음 편 예고

다음 글에서는
“Tuist로 iOS 모듈 스캐폴딩 자동화하기” 를 주제로,
tuisttool.swift 또는 템플릿 유틸을 활용해
모듈 생성, 경로 자동 생성, 의존성 주입까지 자동화하는 실전 예제를 소개할 예정입니다.


✌️ Peace!

profile
iOS 개발자 공부하는 Roy

0개의 댓글