Tuist Plugin 만들기 + Settings 설정

by DDD

이 글을 쓰게 된 계기


안녕하세요! iOS 운영진 서원지입니다 ㅋㅋㅋ

Tuist로 모듈화 하다 보면 이런 고민이 생겨요:


"매번 비슷한 코드 반복하기 싫은데... 템플릿화 못 하나?"

"환경별로 설정 다르게 하고 싶은데 어떻게 하지?"


그래서 오늘은 Tuist Plugin 만들기랑 Settings 설정을 한 방에 정리해볼게요!


⚠️ 제가 공부하면서 정리한 내용이라 틀린 부분 있을 수 있어요! 잘못된 부분 있으면 편하게 알려주세요 �



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


Part 1: Tuist Plugin이란?


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



Tuist Plugin은 Tuist 환경에서만 작동하는 확장 코드예요.

이걸로 뭘 할 수 있냐면:


· ProjectTemplatePlugin → 모듈 템플릿 정의 (makeAppModule, makeModule)

· DependencyPlugin → 내부 모듈 enum 정의 (.Shared(.DesignSystem))

· DependencyPackagePlugin → 외부 라이브러리 정의 (SPM 설정)



플러그인 디렉토리 구조


01_plugin_structure.png



� 플러그인 이름은 자유롭게! 근데 역할별로 명확하게 나누는 게 유지보수에 좋아요.



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


Tuist.swift에서 플러그인 등록하기


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



프로젝트 루트에 Tuist.swift 파일 만들어서:


02_tuist_swift.png



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


Plugin.swift도 필요해요!


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



각 플러그인 폴더에 Plugin.swift 파일 필수!


03_plugin_swift.png


이거 없으면 Tuist가 플러그인 인식 못 해요 ㅠㅠ



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


ModulePath로 모듈 경로 관리하기


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



모듈이 많아지면 경로 관리가 진짜 귀찮아요...

그래서 ModulePath enum으로 계층 구조를 명확하게!


04_module_path.png



각 모듈 계층 정의


05_module_hierarchy.png



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


� Path 확장으로 경로 자동화


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



매번 이렇게 쓰기 싫잖아요?


06_path_bad.png



Path Extension 만들기!


07_path_extension.png



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


TargetDependency 확장으로 의존성 간결하게!


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


08_dependency_before_after.png



Extension 만들기


09_target_dependency_ext.png



사용 예시


10_usage_example.png


진짜 깔끔해요! �



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


�️ Project 템플릿 함수 만들기


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



makeAppModule - 앱 타겟용


11_make_app_module.png


생성되는 타겟:

· appTarget - 기본 앱 타겟

· appDevTarget - Debug 환경용

· appStageTarget - Stage 환경용

· appProdTarget - Prod 환경용

· appTestTarget - 유닛 테스트용



makeModule - 일반 모듈용


12_make_module.png



makeScheme - 스킴 템플릿


13_make_scheme.png



사용 예시


14_module_usage.png



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


� Part 2: Settings 설정 완전 정복


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



여기서부터가 진짜 중요한 부분이에요!

환경별로 설정 다르게 하고 싶을 때 Settings.swift를 활용합니다.



commonSettings 함수


환경별로 중복되는 설정을 재사용하기 위한 유틸 함수:


15_common_settings.png



설정 항목 설명


· setProductName → 실행 파일 이름 (PRODUCT_NAME)

· setCFBundleDisplayName → 홈 화면에 표시될 앱 이름

· setOtherLdFlags → Objective-C 런타임 로딩 설정

· setDebugInformationFormat → .dSYM 생성 (크래시 추적용)

· setProvisioningProfileSpecifier → 서명에 사용할 프로파일

· setSkipInstall → 아카이브 대상 포함 여부



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


� appMainSetting - 앱 전용 빌드 설정


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


16_app_main_setting.png



� base 설정 항목 정리


· setProductName → 빌드 타겟의 실행 파일 이름

· setCFBundleDisplayName → 디바이스에 표시되는 앱 이름

· setMarketingVersion → 사용자에게 보이는 앱 버전

· setASAuthenticationServicesEnabled → Apple 로그인 활성화

· setPushNotificationsEnabled → 푸시 알림 권한

· setEnableBackgroundModes → 백그라운드 fetch, location 등

· setArchs → 아키텍처 설정 (arm64)

· setCurrentProjectVersion → 빌드 넘버

· setCodeSignIdentity → 서명 인증서

· setCodeSignStyle → Automatic or Manual

· setSwiftVersion → Swift 버전 고정

· setDevelopmentTeam → Apple Developer Team ID

· setDebugInformationFormat → .dSYM 생성 여부



� Configuration별 구성


· .debug → 개발용, 디버깅 (dev.xcconfig)

· "Stage" → QA/테스트용 (qa.xcconfig)

· .release → 내부 릴리즈용 (release.xcconfig)

· "Prod" → 실제 App Store 배포 (release.xcconfig)


� Stage, Prod는 Tuist 기본 enum이 아니라 문자열로 직접 지정해야 해요!



� 활용 팁


Prod와 Release를 분리하는 이유

· CI 파이프라인 분리: release는 내부 테스트, prod는 실제 배포

· 설정 분기: 앱 이름, 아이콘, API 엔드포인트 등 다르게 가능



xcconfig 활용


17_xcconfig.png


� 민감한 정보는 .gitignore에 추가하거나 암호화된 저장소에서 관리하세요!



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


✅ 전체 정리


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



Plugin 정리


· Plugin 구조 → ProjectTemplatePlugin, DependencyPlugin, DependencyPackagePlugin

· ModulePath → enum 기반 모듈 경로 관리

· Path 확장 → .Shared(implementation:) 등으로 경로 자동화

· TargetDependency 확장 → .Shared(implements:) 등으로 의존성 간결화

· 템플릿 함수 → makeAppModule, makeModule, makeScheme



Settings 정리


· 공통 설정 추출 → commonSettings() 함수로 중복 제거

· 코드 기반 설정 → Git으로 추적 가능

· 환경별 분리 → Debug, Stage, Release, Prod

· xcconfig 연동 → 민감한 설정 외부 파일로 관리



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


마무리


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



Tuist Plugin이랑 Settings 설정, 처음엔 좀 복잡해 보이는데...

한 번 세팅해두면 진짜 편해요!


특히:

1. ModulePath + Path Extension = 경로 오타 방지

2. TargetDependency Extension = 의존성 선언 깔끔

3. makeModule 템플릿 = 새 모듈 추가 쉬움

4. Settings 분리 = 환경별 빌드 설정 완벽 관리


작가의 이전글Tuist를 쓰면서 Asset 코드생성은 직접 한 이유