Migrate a Swift Package
Swift Package Manager는 Swift 코드의 의존성 관리를 위해 등장했지만 의도치않게 프로젝트 관리 문제를 해결하고 Objective-C와 같은 다른 프로그래밍 언어를 지원하게 되었습니다. 이 툴은 다른 목적으로 설계되었지만, Tuist에서 제공하는 유연성, 성능, 그리고 기능이 부족해서 대규모 프로젝트에 적합하지 않을 수 있습니다. 이것은 Scaling iOS at Bumble 문서에 잘 설명되어 있으며, 다음과 같이 Swift Package Manager와 Xcode 프로젝트의 성능 비교표를 포함합니다:
Swift Package Manager가 프로젝트 관리 역할을 할 수 있다는 점을 고려하면 Tuist의 필요성에 대해 의문을 제기하는 개발자와 조직을 만나곤 합니다. 마이그레이션을 진행한 후에 일부 인원은 개발자의 경험이 크게 저하되어 있었다는 것을 깨닫습니다. 예를 들어, 파일의 이름을 바꾸면 다시 인덱싱하는데 15초가 걸릴 수 있습니다. 15초!
Apple은 Swift Package Manager를 대규모 프로젝트에 적합하게 만들지는 알 수 없습니다. 그러나 이런 일은 일어나지 않을 것 같습니다. 실제로, 우리는 그 반대의 상황을 보고 있습니다. Apple은 암시적 구성을 통해 편리함을 추구하는 것과 같이 Xcode에서 영감을 받아 결정 합니다. 이것은 아시다시피 대규모 프로젝트에서 복잡성의 원인입니다. 우리는 Apple이 기본 원칙으로 돌아가서 의존성 관리 도구로서 의미가 있지만 프로젝트 관리 도구로는 의미가 없는 몇 가지 결정을 재검증 해야 한다고 생각합니다. 예를 들어 프로젝트 정의하기 위한 인터페이스로 컴파일된 언어를 사용하는 것입니다.
의존성 관리 도구로의 SPM\
Tuist는 Swift Package Manager를 의존성 관리 도구로만 취급하고, 의존성 관리 도구로는 아주 훌륭합니다. 우리는 의존성을 해결하고 빌드를 위해 사용합니다. 프로젝트를 정의하는 용도로 설계되지 않았으므로, 그 용도로 사용하지 않습니다.
Swift Package Manager를 Tuist로 마이그레이션
Swift Package Manager와 Tuist는 유사하므로 마이그레이션 동작은 간단합니다. 다른점은 Package.swift
대신에 Tuist의 DSL을 사용하여 프로젝트를 정의한다는 것입니다.
먼저, Package.swift
파일 있는 곳에 Project.swift
파일을 생성합니다. Project.swift
파일은 프로젝트 정의가 포함됩니다. 다음은 하나의 타겟을 가지는 프로젝트를 정의하는 Project.swift
파일의 예제입니다:
import ProjectDescription
let project = Project(
name: "App",
targets: [
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "io.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)
주의할 점:
- ProjectDescription:
PackageDescription
대신에ProjectDescription
을 사용합니다. - Project:
package
인스턴스를 내보내는 대신에project
인스턴스를 내보냅니다. - Xcode 언어: 프로젝트를 정의하는데 사용하는 기본 요소는 Xcode의 언어를 따르므로 스킴, 타겟, 그리고 Build Phases 등을 찾을 수 있습니다.
그런 다음에 다음 내용을 가지는 Tuist.swift
파일을 생성합니다:
import ProjectDescription
let tuist = Tuist()
Tuist.swift
는 프로젝트의 구성을 포함하고 해당 파일의 경로는 프로젝트의 루트를 결정하는 기준으로 사용됩니다. Tuist 프로젝트의 구조에 대해 알아보려면 디렉토리 구조 문서에서 확인 가능합니다.
프로젝트 수정
이 명령어는 프로젝트를 열고 작업을 수행할 수 있게 Xcode 프로젝트를 생성합니다. tuist edit
를 사용하여 Xcode에서 프로젝트를 수정할 수 있습니다.
tuist edit
프로젝트 규모에 따라 한 번에 사용하거나 점진적으로 사용할 수 있습니다. DSL과 워크플로우에 익숙해지기 위해 작은 프로젝트로 시작하는 것을 권장합니다. 우리의 조언은 가장 많은 의존성을 가진 타겟부터 시작하여 최상위 타겟까지 차례대로 작업하라는 것입니다.