본문 바로가기
Tuist/Tuist-기본

Tuist - 2) Target - 1 이론

by KS피터 2023. 11. 30.

Tuist 학습 일기장

Xcode에서 Target의 기본 정의와 Tuist에서 Target 생성을 위해 제공하는 모델 내부에 대한 정리를 기록하고 있습니다.

23.12.05 수정사항

기존 작성된 생성자는 deprecated 되어 수정 작성하였습니다. 자세한 사항은 해당 글을 참고 해주시면 좋을 것 같습니다.

 

Tuist Target destinations 변경사항(Platform deprecated)

Tuist 신규 버전(작성 기준 3.35.1)에서 Target 생성 시 platform 설정 파라미터가 deprecated 되었습니다. 관련해서 변경사항을 확인하고 대응 방법을 확인해 보겠습니다. 목차 Target init deprecated 우선 Tuist P

ks-peter.tistory.com

 

이전글

Tuist - 1) 설치

 

Tuist - 1) 설치

Tuist 학습 일기장 Tuist 설치부터 초기화까지 내용을 기록하고 있습니다. 목차 Tuist Xcode 프로젝트 관리 툴로써 협업에서 XcodeGen처럼 프로젝트 모듈화나 프로젝트 설정 관리를 효과적으로 사용할

ks-peter.tistory.com

 

목차

     

     

     

    Target

    애플 공식 문서에 따르면 다음과 같이 타겟을 설명하고 있습니다.

     

    Xcode Target

    Xcode Target A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and

    developer.apple.com

    Target이란 프로젝트와 워크스페이스에서 프로덕트를 빌드하기 위한 지침들을 포함. 하나의 Xcode 프로젝트는 여러 개의 target을 가질 수 있으며, 하나의 Target은 하나의 프로덕트를 만들어낸다

     

     

    위 문서를 정리하면 아래와 같이 Target에 대한 정의, 가지고 있는 정보들을 생각할 수 있습니다.

    • 하나의 프로덕트를 빌드하기 위한 지침(instructions)
      • 지침(instructions): Build Setting, Build Phases

    Xcode 프로젝트 내 타겟에 설정된 Build Setting ,  Build Phases

    • 하나의 Xcode 프로젝트(Project)는 여러 개의 Target을 가질 수 있다

    프로젝트 내에 존재하는 여러 타겟들

    • 하나의 Target은 하나의 프로덕트(Product)를 만든다
      • 프로덕트(Product): App, Framework, Unit Test, UI Test...

    Target 생성 시 어떤 Product인지 지정

    위에 설명처럼 프로젝트 내에 여러 타겟들을 이용하여 앱을 구성할 수 있게 됩니다.

     

    Tuist struct Target

    Tuist에서 Target을 추가 생성 하기 위해서는 ProjectDescription에 Target 구조체를 이용하여 생성이 가능합니다. 공식 문서

     

    Target init 23.12.05 수정

    Target 초기화는 아래 코드와 같습니다.

    new init

    • platform: Platform 제거 및 destinations: Destinations 추가
    • deploymentTarget → deploymentTargets 변경
    Target(name: String,
           destinations: Destinations,
           product: Product,
           productName: String? = nil,
           bundleId: String,
           deploymentTargets: DeploymentTargets? = nil,
           infoPlist: InfoPlist? = .default,
           sources: SourceFilesList? = nil,
           resources: ResourceFileElements? = nil,
           copyFiles: [CopyFilesAction]? = nil,
           headers: Headers? = nil,
           entitlements: Entitlements? = nil,
           scripts: [TargetScript] = [],
           dependencies: [TargetDependency] = [],
           settings: Settings? = nil,
           coreDataModels: [CoreDataModel] = [],
           environmentVariables: [String : EnvironmentVariable] = [:],
           launchArguments: [LaunchArgument] = [],
           additionalFiles: [FileElement] = [],
           buildRules: [BuildRule] = [],
           mergedBinaryType: MergedBinaryType = .disabled,
           mergeable: Bool = false)

    deprecated init

    아래 기존 생성자는 deprecated 되었습니다.

    @available(*, deprecated, message: "Use `Destinations` and `DeploymentTargets` to configure deployment devices and minimum platform versions.")
    Target(name: String,
           platform: Platform,
           product: Product,
           productName: String? = nil,
           bundleId: String,
           deploymentTarget: DeploymentTarget? = nil,
           infoPlist: InfoPlist? = .default,
           sources: SourceFilesList? = nil,
           resources: ResourceFileElements? = nil,
           copyFiles: [CopyFilesAction]? = nil,
           headers: Headers? = nil,
           entitlements: Path? = nil,
           scripts: [TargetScript] = [],
           dependencies: [TargetDependency] = [],
           settings: Settings? = nil,
           coreDataModels: [CoreDataModel] = [],
           environmentVariables: [String : EnvironmentVariable] = [:],
           launchArguments: [LaunchArgument] = [],
           additionalFiles: [FileElement] = [],
           buildRules: [BuildRule] = [],
           mergedBinaryType: MergedBinaryType = .disabled,
           mergeable: Bool = false)

     

    Target init paramter

    초기화 파라미터들 다음과 같습니다.

    name

    • Target 이름.

    destinations

    Target.init(...
                destinations: [.iPhone, .iPad],
                ...)

    Target - General - Supported Destinations 결과 화면

    plaform deprecated

    • Target 프로덕트의 플랫폼
    • Platform enum 타입 공식 문서
      • iOS
      • macOS
      • watchOS
      • tvOS
      • visionOS

    product

    • Target의 빌드 프로덕트 유형
    • Product enum 타입 공식 문서
      • app
      • staticLibrary
      • dynamicLibrary
      • framework
      • staticFramework
      • unitTests
      • uiTests
      • bundle
      • commandLineTool
      • appClip
      • appExtension
      • watch2App
      • watch2Extension
      • tvTopShelfExtension
      • messagesExtension
      • stickerPackExtension
      • xpc
      • systemExtension
      • extensionKitExtension

    productName

    • Build Settings에 Product Name 설정. nil일 경우 Target name 적용.

    Build Settings > Product Name 설정 결과 화면

    bundleId

    • 제품 Bundle 식별자

    Bundle Identifier 설정 결과 화면

    deploymentTargets

    • Target 프로덕트 지원 최소 버전 설정
    • DeploymentTargets struct 타입 공식 문서
    • init을 통해 다중 최소 지원 버전 설정
    // DeploymentTargets
    
    public init(iOS: String? = nil,
                macOS: String? = nil,
                watchOS: String? = nil,
                tvOS: String? = nil,
                visionOS: String? = nil)
    • 내부 static func를 이용하여 최소 버전 설정
      • static func iOS(_ version: String) -> DeploymentTargets: iOS 버전
      • static func macOS(_ version: String) -> DeploymentTargets: macOS 버전
      • static func watchOS(_ version: String) -> DeploymentTargets: watchOS 버전
      • static func tvOS(_ version: String) -> DeploymentTargets: tvOS 버전
      • static func visionOS(_ version: String) -> DeploymentTargets: visionOS 버전
    Target.init(...
                deploymentTargets: .iOS("15.0"),
                ...)

    Target - General Minimum Deployments 설정 결과 화면

    deploymentTarget deprecated

    • 프로덕트 지원 최소 버전 설정
    • DeploymentTarget enum 타입 공식 문서
      • iOS(targetVersion: String, devices: ProjectDescription.DeploymentDevice, supportsMacDesignedForIOS: Bool = true): iOS 버전
      • macOS(targetVersion: String): MacOS 버전
      • watchOS(targetVersion: String): WatchOS 버전
      • tvOS(targetVersion: String): tvOS 버전
      • visionOS(targetVersion: String): VisionOS 버전
    // 예시
    Target.init(...
                deploymentTarget: .iOS(targetVersion: "17.0",
                                       devices: [.iphone, .ipad],
                                       supportsmacDesignedForIOS: false),
                ...)

    deployment 설정 결과 화면

    infoPlist

    • Target info.plist 설정
    • InfoPlist enum 타입 공식 문서
      • file(path: Path)
      • dictionary([String: Plist.Value])
      • extendingDefault(with: [String: Plist.Value])
    • 내부에 static var default로 기본 InfoPlist 제공

    default InfoPlist 설정 결과 화면

    sources

    • Target 소스코드 파일 목록
    • Glob Pattern을 이용한 문자열 배열로 지정 가능
    • static func paths 이용하여 Path 배열로 지정 가능

    sources 설정 Build Phases 화면
    sources 설정 파일 목록 화면

    resources

    • Target 리소스 파일 목록
    • Glob Pattern을 이용한 문자열 배열로 지정 가능
    • static func paths 이용하여 Path 배열로 지정 가능

    sources 설정 Build Phases 화면
    resources 설정 파일 목록 화면

    copyFiles

    • Target Builde Phases에 파일 복사 추가
    • Destination에 따라 CopyFilesAction 안에 있는 CopyFilesAction.Destination에 매칭되는 static func를 이용하여 생성
    • 공식 문서
    // 예시
    Target.init(...
                copyFiles: [
                    CopyFilesAction.productsDirectory(name: "Copy Manifest Project",
                                                      files: ["Project.swift"])
                ],
                ...)

    copyFiles 설정 결과 화면

    headers

    • Target 헤더 설정
    • 학습 후 추가 예정

    entitlements

    • 타겟 자격증명 설정
    • Entitlements enum 타입 공식 문서
      • file(path: ProjectDescription.Path): entitlements 파일 지정
      • dictionary([String : ProjectDescription.Plist.Value]): Key, Value 지정

    scripts

    • 타겟 빌드 시 동작 스크립트 설정
    • TargetScript내에 static func를 이용하여 추가 공식 문서
      • pre: 빌드 수행하는 스크립트 설정
      • post: 빌드 수행하는 스크립트 설정
    // 예시
    Target.init(...
                scripts: [
                    .pre(script: "${PODS_ROOT}/SwiftLint/swiftlint",
                         name: "Pre Run SwiftLint"),
                    .post(script: "${PODS_ROOT}/SwiftLint/swiftlint",
                          name: "Post Run SwiftLint"),
                ],
                ...)

    scripts 설정 Build Phases 결과 화면

    dependencies

    • Target 의존성 설정
    • TargetDependency enum 타입 공식 문서
      • target(name: String): 같은 프로젝트 Target
      • project(target: String, path: ProjectDescription.Path): 다른 프로젝트 Target
      • framework(path: ProjectDescription.Path, status: ProjectDescription.FrameworkStatus = .required): 미리 구현된 framework
      • library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?): 미리 구현된 library
      • package(product: String, type: ProjectDescription.TargetDependency.PackageType = .runtime): Swift Package Manager 의존성 주입. 해당 사용보다는 external을 이용한 외부 의존성 주입을 추천(추후 관련 설명 예정. 관련 문서)
      • packagePlugin(product: String): Swift Package Manager 플러그인
      • sdk(name: String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus): 시스템 library 또는 framework
      • xcframework(path: ProjectDescription.Path, status: ProjectDescription.FrameworkStatus = .required): xcframework
      • xctest: XCTest
      • external(name: String): Dependencies.swift 통해 정의된 외부 종속성
    // 예시
    Target.init(...
                dependencies: [
                    .target(name: "TuistExKit"),
                    .target(name: "TuistExKit")
                ],
                ...)

    dependencies 설정 결과 Target -> General 화면

    settings

    • Target 설정 정의
    • static func settings를 이용하여 설정
    • 공식 문서

    coreDataModels

    • Core Data 모델 설정
    • struct CoreDataModel 생성하여 배열로 설정
    • 공식 문서

    environmentVariables

    • 환경변수. Target Scheme에 자동생성 시 사용
    • Dictionary Key: String, Value: EnvironmentVariable로 설정
    • 공식 문서
    // 예시
    Target.init(...
                environmentVariables: [
                    "OS_ACTIVITY_MODE": EnvironmentVariable(value: "disable",
                                                            isEnabled: true)
                ],
                ...)

    environmentVariables 설정 Edit Scheme 결과 화면

    launchArguments

    • 실행 시 전달인수. Target Scheme에 자동생성 시 사용
    • struct LaunchArgument 생성하여 배열로 설정
    • 공식 문서
    // 예시
    Target.init(...
                launchArguments: [
                    LaunchArgument(name: "-FIRAnalyticsDebugEnabled",
                                   isEnabled: true)
                ],
                ...)

    launchArguments 설정 Edit Scheme 결과 화면

     

    additionalFiles

    • Target에 추가 파일 설정
    • FileElement enum 배열 타입 공식 문서
      • Glob Pattern을 이용한 문자열 배열로 지정 가능
      • glob(pattern: ProjectDescription.Path)
      • folderReference(path: ProjectDescription.Path)

    buildRules

    • 컴파일 시 소스 파일을 출력 파일로 변환하는 규칙 설정
    • struct BuildRule을 생성하여 배열로 설정 공식 문서

    mergeBinaryType

    • Target이 바이너리의 일부로 동적 의존성을 병합할 수 있는지 여부 설정
    • 기능 설명 애플 공식 문서
    • MergeBinaryType enum 타입 공식 문서
      • disabled
      • automatic
      • manual(mergeableDependencies: Set)

    mergeable

    • Target이 다른 바이너리의 일부로 병합될 수 있는지 여부 설정

     

    마치며

    이번 글에서는 Target 생성을 위한 기본 이론과 Tuist에서 Target 모델을 생성 시 각 파라미터에 대해 조사해보왔습니다.

    다음 글에서는 기존 예제를 이용하여 Target 템플릿을 수정하고 실제 Target을 만드는 과정을 작성하겠습니다.

     

    다음편

    Tuist - 2) Target - 2 예제

     

    Tuist - 2) Target - 2 예제

    Tuist 학습 일기장 지난번 Tuist에서 제공하는 Target 모델에 대해서 알아봤습니다. 이번에는 예제를 통해 실제 Target이 만들어지고 설정하는 방법에 대해서 작성하겠습니다. 이전글 - Tuist - 2) Target -

    ks-peter.tistory.com

     

    반응형

    'Tuist > Tuist-기본' 카테고리의 다른 글

    Tuist - 2) Target - 2 예제  (0) 2023.12.08
    Tuist - 1) 설치  (0) 2023.11.28