Tuist 학습 일기장
Xcode에서 Target의 기본 정의와 Tuist에서 Target 생성을 위해 제공하는 모델 내부에 대한 정리를 기록하고 있습니다.
23.12.05 수정사항
기존 작성된 생성자는 deprecated 되어 수정 작성하였습니다. 자세한 사항은 해당 글을 참고 해주시면 좋을 것 같습니다.
이전글
목차
Target
애플 공식 문서에 따르면 다음과 같이 타겟을 설명하고 있습니다.
Target이란 프로젝트와 워크스페이스에서 프로덕트를 빌드하기 위한 지침들을 포함. 하나의 Xcode 프로젝트는 여러 개의 target을 가질 수 있으며, 하나의 Target은 하나의 프로덕트를 만들어낸다
위 문서를 정리하면 아래와 같이 Target에 대한 정의, 가지고 있는 정보들을 생각할 수 있습니다.
- 하나의 프로덕트를 빌드하기 위한 지침(instructions)
- 지침(instructions): Build Setting, Build Phases
- 하나의 Xcode 프로젝트(Project)는 여러 개의 Target을 가질 수 있다
- 하나의 Target은 하나의 프로덕트(Product)를 만든다
- 프로덕트(Product): App, Framework, Unit Test, UI Test...
위에 설명처럼 프로젝트 내에 여러 타겟들을 이용하여 앱을 구성할 수 있게 됩니다.
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에서 지원되는 배포 대상 설정
- Destination enum 타입를 Set으로 주입 공식 문서 Destinations, 공식 문서_Destionation
- iPhone
- iPad
- mac
- macWithiPadDesign
- macCatalyst
- appleWatch
- appleTv
- appleVision
- appleVisionWithiPadDesign
Target.init(...
destinations: [.iPhone, .iPad],
...)
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 적용.
bundleId
- 제품 Bundle 식별자
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"),
...)
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),
...)
infoPlist
- Target info.plist 설정
- InfoPlist enum 타입 공식 문서
- file(path: Path)
- dictionary([String: Plist.Value])
- extendingDefault(with: [String: Plist.Value])
- 내부에 static var default로 기본 InfoPlist 제공
sources
- Target 소스코드 파일 목록
- Glob Pattern을 이용한 문자열 배열로 지정 가능
- static func paths 이용하여 Path 배열로 지정 가능
resources
- Target 리소스 파일 목록
- Glob Pattern을 이용한 문자열 배열로 지정 가능
- static func paths 이용하여 Path 배열로 지정 가능
copyFiles
- Target Builde Phases에 파일 복사 추가
- Destination에 따라 CopyFilesAction 안에 있는 CopyFilesAction.Destination에 매칭되는 static func를 이용하여 생성
- 공식 문서
// 예시
Target.init(...
copyFiles: [
CopyFilesAction.productsDirectory(name: "Copy Manifest Project",
files: ["Project.swift"])
],
...)
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"),
],
...)
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")
],
...)
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)
],
...)
launchArguments
- 실행 시 전달인수. Target Scheme에 자동생성 시 사용
- struct LaunchArgument 생성하여 배열로 설정
- 공식 문서
// 예시
Target.init(...
launchArguments: [
LaunchArgument(name: "-FIRAnalyticsDebugEnabled",
isEnabled: true)
],
...)
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 > Tuist-기본' 카테고리의 다른 글
Tuist - 2) Target - 2 예제 (0) | 2023.12.08 |
---|---|
Tuist - 1) 설치 (0) | 2023.11.28 |