본문 바로가기
PROGRAMMING CODE/SWIFT

[Xcode] Tuist 개념들

by daye_ 2023. 11. 22.

 

Tuist란? 

Tuist는 Xcode 프로젝트를 Swift로 생성/관리할 수 있도록 도와주는 도구

 

 

Tuist의 장점

깃으로 프로젝트 형상관리를 하다보면 project파일의 conflict로 시간을 허비할때가 많다.

하지만 Tuist를 사용하게 되면 프로젝트 파일을 자동으로 생성해 주기 때문에 프로젝트를 더 생산성 높게 관리할 수 있다.

성능개선으로 외 모듈 간 의존관계조정 이 쉬워지며 static framework로 성능개선효과, dynamic link, launch time 감소하며,

cachingd의 모듈을 pre-build하게 되며 변경된 부분민 빌드하면 되기 때문에 빌드시간을 감소시킬 수 있다.

 

1. xcodeproj 파일 충돌 회피

2. 모듈화 편리

3. 모듈 의존관계 파악

4. 스위프트 언어를 통해 모듈과 프로젝트 설정을 정의할 수 있다.

 

Tuist의 단점

1. 매번 Tuist generate를 해줘야함, branch가 바뀔때,, (체크아웃할때 명령어 끼워넣으면 된다. )

2. 파일이름이 알파벳 순서로 자동정렬(고칠  수 없음)

3. Tuist를 세팅한 사람에게 dependency가 생길 수 있다.

 

 

생성방식(순서)

1. Tuist edit

2. Tuist fetch 

3. Tuist generate - Resources(String, color,,, )-> Derived

 

 

App, 모듈1, 모듈2

 

- Project Description : 이 프레임워크에 백, 모듈 정의

- AppManifests : project.swift, Resources(Assets), Sources

- DesignSystemManifests : staticframework

- Dependnecies : cocoaPod 썼던것을 이것으로 대체

- Workspace: 프로젝트 경로 지정

 

Static FrameworkStatic Linker를 통해 Static Library 코드가 어플리케이션 코드 내로 들어가 Heap 메모리에 상주하기때문에 빌드가 빨라짐

반면, Xcode에서 Framework를 만들면 기본적으로 Dynamic Framework으로 만들어짐. Dynamic Framework는 동시에 여러 프레임워크 또는 프로그램에서 동일한 코드 사본을 공유하고 사용을 하므로, 메모리를 효율적으로 사용함. 동적으로 연결되어 있으므로, 전체 빌드를 다시 하지 않아도 새로운 프레임워크 사용이 가능

 

 

설치 및 사용 공식문서

 

Get started | Tuist Documentation

Learn how to install Tuist in your environment and generate your first project.

docs.tuist.io

 

 

Tuist로 iOS프로젝트 생성

tuist init --platform ios // UIKit
tuist init --platform ios --template swiftui // SwiftUI

 

 

Project.swift 수정하는 명령어 Tuist Edit

tuist edit

 

 

Project.swift

public init(
    name: String, // 프로젝트 이름
    organizationName: String? = nil, // organization의 이름
    options: ProjectDescription.Project.Options = .options(), // xcodeproj파일 생성시 옵션
    packages: [ProjectDescription.Package] = [], // SPM의 package
    settings: ProjectDescription.Settings? = nil, // build settings 정보들 설정
    targets: [ProjectDescription.Target] = [], // 프로젝트의 타겟을 의미한다.
    schemes: [ProjectDescription.Scheme] = [], // 프로젝트의 scheme를 의미한다.
    fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, // Custom 헤더파일
    additionalFiles: [ProjectDescription.FileElement] = [], 
    //자동으로 연결해주지 않는 파일 넣으면 프로젝트에 연결시켜줌
    resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default 
    //Resources/안에 파일 확장자에 따라 enum을 자동으로 생성
    //.default strinfs, plists, fonts, assets
)

 

 

 

 

WorkSpace.swift

.xcworkspace 워크스페이스를 어떻게 만들지 정의하는 파일

public init(
    name: String, //워크스페이스 이름
    projects: [ProjectDescription.Path], //Workspaced에 등록할 프로젝트들의 경로 추가
    schemes: [ProjectDescription.Scheme] = [], //Project.swift와 동일
    fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, //Project.swift와 동일
    additionalFiles: [ProjectDescription.FileElement] = [], //Project.swift와 동일
    generationOptions: ProjectDescription.Workspace.GenerationOptions = .options() 
    //Tuist가 xcworkspace파일을 만들 때의 옵션을 설정해 줄 수 있다.
)

 

 

Config.swift

프로젝트 전역으로 쓰이는 설정 가능

Swift의 버전이나 Xcode의 버전 등

Config.swift는 {프로젝트 루트 디렉토리}/Tuist/Config.swift 에 있을 때만 적용된다.

 

 

Target

Target은 사용할 모듈을 정의하는 struct이다.

public init(
    name: String, //타겟이름
    platform: ProjectDescription.Platform, //ios, macOS, tvOS,,,
    product: ProjectDescription.Product, //app, staticFramework, framework,,,,
    productName: String? = nil, /product이름
    bundleId: String, //Bundle Identifier
    deploymentTarget: ProjectDescription.DeploymentTarget? = nil, //배포 타겟 설정
    infoPlist: ProjectDescription.InfoPlist? = .default, // info.plist
    sources: ProjectDescription.SourceFilesList? = nil, // 소스코드 경로
    resources: ProjectDescription.ResourceFileElements? = nil, // resourceSynthesizers에서 Tuist가 Resources/ 의 리소스 경로
    copyFiles: [ProjectDescription.CopyFilesAction]? = nil, // 타겟에 대한 Build Phase 파일 복사
    headers: ProjectDescription.Headers? = nil, //타겟 headers
    entitlements: ProjectDescription.Path? = nil, //타겟 entitlements 경로
    scripts: [ProjectDescription.TargetScript] = [], //타겟 build Phase 스크립트
    dependencies: [ProjectDescription.TargetDependency] = [], //타겟 의존성
    settings: ProjectDescription.Settings? = nil, //타겟 세팅
    coreDataModels: [ProjectDescription.CoreDataModel] = [], //CoreData 모델들의 경로, 버전
    environment: [String : String] = [:], // scheme에서 Edit Scheme… 버튼을 누르면 나오는 창에서 Environment Variables,,, 자동생성
    launchArguments: [ProjectDescription.LaunchArgument] = [], //scheme에서 Edit Scheme… 버튼을 누르면 나오는 창에서 Arguments Passed On Launch,,, 자동생성
    additionalFiles: [ProjectDescription.FileElement] = [] //프로젝트를 생성할 때 자동으로 생겨나지 않는 파일을 등록해놓으면 Xcode에서 볼 수 있음
)

 

 

편집 후 명령어 입력하면 프로젝트 생성

.xcodeproj, scworkspace 파일 생성

tuist generate

 

 

 

나즁에 해볼거~~~

https://baechukim.tistory.com/98

 

[iOS] Tuist 사용법 - 프로젝트 생성 (1)

Tuist에 대해서 공부하면서 작성한 글이라 잘못된 부분이 있을 수 있습니다. 정확한 정보는 https://docs.tuist.io/tutorial/get-started 에서 확인하시길 바랍니다. Tuist란? Tuist는 Xcode프로젝트를 생성, 관리

baechukim.tistory.com

https://baechukim.tistory.com/99

 

[iOS] Tuist 사용법 - Dependencies (2)

Defendencies.swift 만들기 Tuist/ProjectDescriptionHelpers 폴더에 새로운 파일 추가 만약 프로젝트 디렉토리에 Tuist/ProjectDescriptionHelpers가 없으면 생성해줍니다. Defendencies.swift파일을 만들어줍니다. 그리고

baechukim.tistory.com

https://baechukim.tistory.com/100

 

[iOS] Tuist 사용법 - Project Settings (3)

objc Bridging Header Settings의 base에 해당하는 딕셔너리입니다. let baseSettings: [String: SettingValue] = [ "SWIFT_OBJC_BRIDGING_HEADER": "MyApp/Source/MyApp-Bridging-Header.h", ] Project Version (Xcode에서 version, build에 해당) Setting

baechukim.tistory.com