제가 이해하고 공부 한대로 작성한 내용이다 보니 , 정확한 정보가 아닐수도 있습니다
고쳐야 할 부분이 있다면 , 편하게 애기 해주시면 감사 하겠습니다🙏🏻
Tuist에서 Settings.swift는 프로젝트 또는 모듈별 빌드 설정을 관리하는 핵심 파일입니다.
이 파일을 통해 .xcconfig, 빌드 설정, 서명 정보 등을 코드 기반으로 선언하고 재사용할 수 있습니다.
Tuist의 설정은 SettingsDictionary를 중심으로 구성되며, 공통 설정과 환경별 설정(Debug, Release 등)을 나누어 체계적으로 관리할 수 있는 것이 특징입니다.
commonSettings 함수 설명commonSettings 함수는 앱 타겟의 공통적인 설정 값을 하나의 함수로 추출하여
반복을 줄이고 유지보수를 쉽게 하기 위한 유틸 함수입니다.
| 항목 | 설명 |
|---|---|
PRODUCT_NAME | 실행 파일 이름 |
CFBundleDisplayName | 홈 화면에 표시될 앱 이름 |
Provisioning Profile | 서명에 사용할 프로파일 지정 (match와 연계 가능) |
-ObjC, -all_load | Objective-C 런타임, 클래스 카테고리 로딩을 위한 링커 플래그 설정 |
dwarf-with-dsym | 디버그 심볼 파일 포함 (.dSYM 생성을 통해 crash 추적 가능) |
SKIP_INSTALL = YES/NO | 아카이브 대상 포함 여부 설정 |
Settings.appMainSetting 설정 내부의 configurations 항목에 적용됩니다..debug, "Stage", .release, "Prod" 등의 빌드 환경에서 공통 설정을 빠르게 주입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은 앱 실행 타겟을 위한 전역 설정 블록입니다.
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.xcconfigpublic 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
)
| 항목 | 설명 | 활용 이유 |
|---|---|---|
setProductName | PRODUCT_NAME 설정 — 빌드 타겟의 실행 파일 이름을 지정합니다. | 빌드 결과물(exe)의 명확한 네이밍으로, 여러 앱/타겟이 존재할 때 식별 용이 |
setCFBundleDisplayName | 앱의 홈 화면에 표시될 이름 (CFBundleDisplayName) | 실제 디바이스에 표시되는 이름 설정 → 환경별 이름 변경에 유용 (예: Stage 빌드 시 "MyApp-Dev") |
setMarketingVersion | CFBundleShortVersionString 설정 — 사용자에게 노출되는 앱 버전 정보 | App Store 제출 및 사용자 확인용 마케팅 버전 관리 |
setASAuthenticationServicesEnabled | Apple 로그인 활성화 설정 | Apple Sign In 기능을 사용하는 앱의 경우 필수. 설정 누락 시 빌드 실패 가능 |
setPushNotificationsEnabled | 푸시 알림 권한 설정 | Firebase, APNs 등 푸시 기능을 사용할 때 필수 권한. 설정 없으면 푸시 불가 |
setEnableBackgroundModes | 백그라운드 기능 허용 (audio, fetch, location 등) | 백그라운드에서 데이터를 fetch하거나 위치 추적이 필요한 앱에 필수 |
setArchs | 아키텍처 설정 (ARCHS) — 일반적으로 arm64 | Universal 빌드 또는 시뮬레이터/실기기 지원 조합 제어 시 필요 |
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 또는 수동 프로파일 매핑 시 사용. 서명 오류 방지 |
setDevelopmentTeam | Apple Developer Team ID 설정 | 다수의 팀이 있거나 공유 계정 사용 시 필수. 자동 설정 가능 |
setCFBundleDevelopmentRegion | 기본 지역화 언어 설정 (en, ko 등) | 앱 리소스의 지역화 초기 값 설정. 미설정 시 App Store 경고 가능 |
setDebugInformationFormat | 디버깅 정보 형식 지정 (dwarf-with-dsym) | .dSYM 생성 여부 결정. 크래시 리포트 추적/심볼화에 필수 |
| 구성 이름 | 설정 값 요약 | 설명 |
|---|---|---|
.debug | 개발용 설정 + dev.xcconfig | 개발 중 디버깅을 위한 환경으로, 로그 출력, 테스트 서버 접근, 디버깅 심볼 포함 등의 설정이 적용됩니다. 앱 아이콘/이름에 "Dev" 또는 "-Debug"가 붙는 경우가 많습니다. |
"Stage" | 스테이징 설정 + qa.xcconfig | QA 및 내부 검증용 환경입니다. 실제 운영 API와 거의 동일하게 구성되지만, 안정성 테스트나 UAT(User Acceptance Test) 용도로 분리됩니다. 빌드 타겟명에 -Stage를 붙여 사용합니다. |
.release | 릴리즈 설정 + realse.xcconfig | App Store 등록용 빌드를 위한 구성입니다. 최적화가 활성화되며, 디버깅 정보는 줄어듭니다. 하지만 일반적으로 내부에서 사용하는 실제 배포는 "Prod"를 사용합니다. |
"Prod" | 프로덕션 설정 + realse.xcconfig | 최종 배포 환경을 위한 별도 스킴입니다. .release와 동일한 xcconfig를 사용하지만, 타겟 이름이나 DisplayName, 앱 아이콘 등을 구분할 수 있도록 구성됩니다. |
💡
Stage와Prod는.debug,.release처럼 Tuist 기본 enum이 아니기 때문에 문자열로 직접 지정해야 합니다
Prod와 Release를 분리하는 이유
→ 보통 CI 파이프라인을 분리하거나, 운영/스토어 배포를 이중 분기하기 위함입니다.
예를 들어: release는 내부 테스트용, prod는 실제 App Store 제출용으로 나누어 사용합니다.
Stage는 QA팀 또는 고객사 테스트용으로 사용
→ 기기 등록이 별도로 필요하거나, QA 서버 연동을 위한 스테이징 환경으로 활용됩니다.
일반적으로 앱 이름 뒤에 -Stage와 같은 표시를 붙여 시각적으로 구분합니다.
환경 변수는 .xcconfig 파일로 관리
→ dev.xcconfig, qa.xcconfig, realse.xcconfig 등의 외부 파일에
API Key, 서버 주소, 버전, Feature Flag 등을 선언하여
환경별로 분기 처리 및 보안 관리를 할 수 있습니다.
💡
xcconfig는 Git에서.gitignore로 제외하거나, 암호화된 저장소에서 관리하는 것이 좋습니다.
iOS 대규모 프로젝트를 운영하다 보면, 환경별로 서로 다른 설정을 요구하거나
팀원 간 빌드 설정이 엇갈려 생기는 문제들이 종종 발생합니다.
이럴 때 Tuist의 Settings.swift를 활용하면 빌드 설정을 코드로 선언하고,
공통 설정과 환경별 설정을 구조화하여 안정성과 생산성을 높일 수 있습니다.
| 항목 | 설명 |
|---|---|
| 공통 설정 추출 | commonSettings() 함수를 통해 환경별로 중복되는 설정을 한 번에 관리 |
| 코드 기반 설정 선언 | GUI 설정이 아닌 코드 기반으로 설정을 선언 → Git으로 추적 가능 |
| 코드서명/프로파일 분리 | 각 환경에 맞게 Provisioning Profile, Team ID 등을 정확하게 분리 |
| 환경별 설정 명확화 | .debug, "Stage", "Prod", .release로 빌드 구성을 명확히 구분 |
| 외부 파일(xcconfig) 연동 | dev.xcconfig, qa.xcconfig 등을 통해 민감한 설정 파일 관리 가능 |
| CI/CD 적합 구조 | 선언형 + 명시적 설정으로 자동화 환경에서도 안정적 빌드 재현 가능 |
| 중복 제거 + 명시성 확보 | 설정 누락 방지, 팀원 간 설정 일관성 유지에 매우 유리 |
.xcconfig 및 SettingsDictionary가 일관된 결과물 보장commonSettings()로 공통 설정 추출appMainSetting에서 base + configurations 설정 분리dev.xcconfig, qa.xcconfig, realse.xcconfig 등 외부 설정 파일 활용Settings.settings(...)를 각 모듈에서 적절히 불러와 재사용Tuist의 Settings.swift를 활용하면 Xcode의 GUI 설정에서 발생할 수 있는
비일관성, 추적 불가능한 변경, 환경별 설정 충돌 문제를 코드 기반으로 해결할 수 있습니다.
특히 다음과 같은 상황에서 효과를 극대화할 수 있습니다:
명시성, 재사용성, 안정성이라는 세 가지 키워드를 갖춘 Settings.swift 구조는
프로젝트 규모가 커질수록 더욱 강력한 무기가 되어 줄 것입니다.
📌 단순히 빌드 설정을 넘어서, 팀 전체의 개발 문화를 "코드 중심"으로 전환하는 데 큰 기여를 합니다.
다음 글에서는
“Tuist로 iOS 모듈 스캐폴딩 자동화하기” 를 주제로,
tuisttool.swift또는 템플릿 유틸을 활용해
모듈 생성, 경로 자동 생성, 의존성 주입까지 자동화하는 실전 예제를 소개할 예정입니다.
✌️ Peace!