Tuist 모듈 자동화 CLI 자동화 만들기

Ios_Roy·2025년 9월 4일

TUIST뿌시기

목록 보기
5/6
post-thumbnail

tuisttool.swift — 나만의 Tuist 모듈 자동화 CLI 도구 만들기

프로젝트에 새로운 모듈을 추가하거나 tuist generate, tuist clean, tuist build 등을 반복적으로 타이핑하다 보면 꽤 귀찮아져서....
그래서 자주 사용하는 명령어들을 묶고, 모듈 템플릿 기반으로 자동 생성할 수 있도록 간단한 CLI 도구를 만들어봤습니다.

이번 글에서는 tuisttool.swift 라는 이름의 커맨드라인 도구를 어떻게 만들었는지, 어떤 기능들을 넣었는지 정리해본다.
나만의 모듈 자동 생성기이자 Tuist의 부족한 CLI 도우미 역할을 톡톡히 해줄 수 있습니다.


🎯 주요 목표

  • tuist generate, fetch, clean, reset 등을 빠르게 실행할 수 있는 CLI
  • 신규 모듈 생성 시 내부/외부 의존성을 CLI 선택지로 받을 수 있도록 지원
  • Modules.swift, SPM.swift를 파싱해 자동으로 의존성 선택
  • 도메인 모듈의 경우 Interface 폴더를 자동 생성해주는 옵션 제공

🛠 명령어 정리

./tuisttool.swift generate      # tuist generate
./tuisttool.swift fetch         # tuist fetch
./tuisttool.swift build         # clean + fetch + generate
./tuisttool.swift clean         # tuist clean
./tuisttool.swift reset         # DerivedData + Tuist 캐시 제거 후 generate
./tuisttool.swift moduleinit    # 새로운 모듈 scaffold + 의존성 자동 삽입

🧪 핵심 구현 포인트

1. run()runCapture()로 쉘 명령 실행

func run(_ command: String, arguments: [String] = []) -> Int32
func runCapture(_ command: String, arguments: [String] = []) throws -> String

단순 실행만 필요한 경우 run()을, 결과 값을 받아야 할 경우 runCapture()를 사용합니다.


2. 모듈 타입/이름/의존성 입력받기

let moduleInput = prompt("모듈 이름 입력")
let moduleName = prompt("생성할 이름 입력")

그리고 의존성은 아래처럼 내부 모듈 또는 SPM 중 선택할 수 있도록 구현했습니다.

  • SPM: Extension+TargetDependencySPM.swift를 파싱
  • 내부 모듈: Modules.swift에서 enum을 파싱하여 enum case 리스트를 출력

3. 실제 Tuist scaffold 실행

let result = run("tuist", arguments: [
  "scaffold", "Module",
  "--layer", layer,
  "--name", moduleName,
  "--author", author,
  "--current-date", currentDate
])

모듈 타입(Presentation, Shared, Core/Domain 등)에 따라 자동으로 layer를 지정해줍니다.


4. 생성된 Project.swift 파일에 의존성 자동 삽입

if var content = try? String(contentsOfFile: projectFile),
   let range = content.range(of: "dependencies: [") {
   ...
   content.insert(contentsOf: "  .SPM.alerter", at: insertIndex)
}

5. 도메인 모듈이면 Interface 디렉토리도 자동 생성

  • Projects/Core/Domain/MyModule/Interface/Sources/Base.swift
  • 인터페이스 정의용 템플릿을 함께 생성

🧩 구조 미리보기

Projects/
└── Core/
    └── Domain/
        └── MyFeature/
            ├── Interface/
            │   └── Sources/
            │       └── Base.swift
            └── Sources/

마무리

모듈 스캐폴딩이 잦아지다 보면 반복되는 작업을 도구화하는 게 필수가 된다고 생각이 듭니다.
Tuist의 장점은 이미 구조화가 잘 되어 있다는 것이고, 그걸 기반으로 나만의 CLI 도구를 곁들이면 생산성을 훨씬 높일 수 있습니다.

앞으로도 이 도구는 지속적으로 고도화해볼 예정이고, 같은 구조를 쓰는 팀원들이라면 함께 써도 좋을 것 같습니다 .

💡 향후 개선 아이디어 예정

  • 여러 모듈 일괄 등록 스크립트
  • GitHub Actions 등 CI 연동 자동화

profile
iOS 개발자 공부하는 Roy

0개의 댓글