관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. Tuist로 모듈화 - tuist init, tuist scaffold, tuist generate 차이 본문

iOS 응용 (swift)

[iOS - swift] 2. Tuist로 모듈화 - tuist init, tuist scaffold, tuist generate 차이

jake-kim 2023. 3. 12. 21:17

* 목차

tuist init, tuist scaffold, tuist generate 차이

  • tuist init: 처음 프로젝트를 만들때, Project.swift, Targets 등 기본적인 구조를 처음부터 생성할때 사용하는 명령어
    • 보통 커스텀하여 필요한 것만 생성해야하므로 tuist init을 사용하는것보단 scaffold를 주로 사용
  • 가장 적절한 사용 방법은 tuist scaffold > tuist generate 순서로 사용
    • tuist scaffold를 이용하여 Templates 토대로 파일들과 Project.swift 파일을 생성해주도록 하고, tuist generate는 Project.swift를 보고 info.plist, .xcworkspace와 같은 본격적으로 개발을 시작할 수 있는 파일들을 생성

(비어있는 폴더에서 tuist init한 결과)

.
├── Plugins
│   └── Test
│       ├── Package.swift
│       ├── Plugin.swift
│       ├── ProjectDescriptionHelpers
│       │   └── LocalHelper.swift
│       └── Sources
│           └── tuist-my-cli
│               └── main.swift
├── Project.swift
├── Targets
│   ├── Test
│   │   ├── Resources
│   │   │   └── LaunchScreen.storyboard
│   │   ├── Sources
│   │   │   └── AppDelegate.swift
│   │   └── Tests
│   │       └── AppTests.swift
│   ├── TestKit
│   │   ├── Sources
│   │   │   └── TestKit.swift
│   │   └── Tests
│   │       └── TestKitTests.swift
│   └── TestUI
│       ├── Sources
│       │   └── TestUI.swift
│       └── Tests
│           └── TestUITests.swift
└── Tuist
    ├── Config.swift
    └── ProjectDescriptionHelpers
        └── Project+Templates.swift

 

  • tuist scaffold: 이전 포스팅 글(Tuist와 템플릿 사용 방법)에서 보았듯이, 특정 템플릿(.stencil, .swift)를 이용하여 지정한 경로 및 .swift 파일들을 템플릿에 맞게 생성해주는 역할 (여기서 Project.swift도 생성하는게 목적)

(이전 포스팅 글에서 알아본대로 아래처럼 파일들을 준비하고)

주의)

1) 이름을 꼭 Tuist, Templates으로 아래처럼 설정해야 동작함

2) Templates하위에 있는 폴더 이름과 그 폴더 안에 있는 .swift 파일 이름이 동일해야함 (jake 디렉토리 == jake.swift)

.
└── Tuist
    └── Templates
        └── jake
            ├── Project.stencil
            └── jake.swift

 

// Project.stencil

import ProjectDescription

let project = Project(
    name: "{{ name }}",
    targets: [
        Target(
            name: "{{ name }}",
            platform: .iOS,
            product: .app,
            bundleId: "com.jake.{{ name }}",
            infoPlist: .extendingDefault(with: [
                "CFBundleShortVersionString": "1.0",
                "CFBundleVersion": "1",
                "UILaunchStoryboardName": "LaunchScreen"
            ]),
            dependencies: [   
                
            ]
        )
    ]
)

 

// jake.swift

import ProjectDescription

let nameAttribute: Template.Attribute = .required("name")

let template = Template(
    description: "Custom template",
    attributes: [
        nameAttribute
    ],
    items: [
        .file(
            path: "Project.swift",
            templatePath: "Project.stencil"
        )
    ]
)

(명령어 tuist scaffold jake --name MyApp 실행하면, Project.swift 파일 생성)

.
└── Tuist
    ├── Project.swift
    └── Templates
        └── jake
            ├── Project.stencil
            └── jake.swift

(생성된 Project.swift 파일)

import ProjectDescription

let project = Project(
    name: "MyApp",
    targets: [
        Target(
            name: "MyApp",
            platform: .iOS,
            product: .app,
            bundleId: "com.jake.MyApp",
            infoPlist: .extendingDefault(with: [
                "CFBundleShortVersionString": "1.0",
                "CFBundleVersion": "1",
                "UILaunchStoryboardName": "LaunchScreen"
            ]),
            dependencies: [   
            ]
        )
    ]
)
  • tuist generate: Project.swift를 보고 info.plist, .xcworkspace와 같은 본격적으로 개발을 시작할 수 있는 파일들을 생성

(tuist generate 결과 - .xcworkspace 파일도 생성)

.
├── Derived
│   └── InfoPlists
│       └── MyApp-Info.plist
├── MyApp.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   │   └── contents.xcworkspacedata
│   ├── xcshareddata
│   │   ├── xcdebugger
│   │   └── xcschemes
│   │       └── MyApp.xcscheme
│   └── xcuserdata
│       └── gimjong-gwon.xcuserdatad
│           └── xcschemes
│               └── xcschememanagement.plist
├── MyApp.xcworkspace
│   ├── contents.xcworkspacedata
│   ├── xcshareddata
│   │   ├── IDEWorkspaceChecks.plist
│   │   ├── WorkspaceSettings.xcsettings
│   │   ├── swiftpm
│   │   │   └── configuration
│   │   └── xcschemes
│   │       └── MyApp-Workspace.xcscheme
│   └── xcuserdata
│       └── gimjong-gwon.xcuserdatad
│           ├── UserInterfaceState.xcuserstate
│           └── xcschemes
│               └── xcschememanagement.plist
├── Project.swift
└── Tuist
    └── Templates
        └── jake
            ├── Project.stencil
            └── jake.swift

* 전체 코드: https://github.com/JK0369/ExTuist_2

 

* 참고

https://github.com/tuist/tuist

https://sarunw.com/posts/tuist-template/

Comments