Swift 패키지 마이그레이션
Swift Package Manager는 Swift 코드의 의존성 관리자로 등장했으며, 의도치 않게 프로젝트 관리와 Objective-C와 같은 다른 프로그래밍 언어 지원을 해결하는 역할을 맡게 되었습니다. 이 도구는 다른 목적을 위해 설계되었기 때문에 Tuist가 제공하는 유연성, 성능 및 강력함을 갖추지 못해 대규모 프로젝트 관리에는 적합하지 않습니다. 이러한 문제는 Bumble의 iOS 확장 사례 아티클에서 잘 설명되어 있으며, 다음 표는 Swift Package Manager와 네이티브 Xcode 프로젝트의 성능을 비교합니다:

Swift Package Manager가 유사한 프로젝트 관리 역할을 수행할 수 있다고 생각해 Tuist의 필요성에 의문을 제기하는 개발자와 조직을 종종 마주칩니다. 일부는 마이그레이션을 시도했다가 개발자 경험이 크게 저하되었다는 사실을 나중에 깨닫기도 합니다. 예를 들어, 파일 이름을 변경하면 재인덱싱에 최대 15초가 걸릴 수 있습니다. 무려 15초나!
Apple이 Swift Package Manager를 대규모 프로젝트 관리용으로 만들지는 불확실합니다. 그러나 현재로서는 그런 움직임이 보이지 않습니다. 오히려 그 반대 현상이 관찰됩니다. Apple은 암시적 구성을 통해 편의성을 추구하는 등 Xcode 중심의 결정을 내리고 있으며, 알다시피 이는 대규모 환경에서 복잡성의 원인이 됩니다. 저희는 Apple이 근본 원칙으로 돌아가 의존성 관리 도구로서는 합리적이었지만 프로젝트 관리 도구로서는 부적합했던 몇 가지 결정(예: 프로젝트를 정의하기 위한 인터페이스로 컴파일된 언어 사용)을 재검토해야 한다고 생각합니다.
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: "dev.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)
주의할 사항:
- ProjectDescription:
PackageDescription대신ProjectDescription를 사용합니다. - 프로젝트:
package인스턴스를 export하는 대신project인스턴스를 export합니다. - Xcode 언어: 프로젝트 정의에 사용하는 기본 요소는 Xcode의 언어 구조를 모방하므로 스킴, 타겟, 빌드 단계 등을 찾을 수 있습니다.
그런 다음 다음 내용을 포함하는 Tuist.swift 파일을 생성하세요:
import ProjectDescription
let tuist = Tuist()
Tuist.swift에는 프로젝트 구성이 포함되며, 해당 경로는 프로젝트 루트를 결정하는 참조점으로 사용됩니다. Tuist 프로젝트 구조에 대해 자세히 알아보려면 디렉터리 구조 문서를 확인하세요.
프로젝트 편집#
tuist edit를 사용하여 Xcode에서 프로젝트를 편집할 수 있습니다. 이 명령은 열어서 작업을 시작할 수 있는 Xcode 프로젝트를 생성합니다.
tuist edit
프로젝트 크기에 따라 한 번에 실행하거나 점진적으로 적용하는 방법을 고려할 수 있습니다. DSL과 워크플로우에 익숙해지기 위해 작은 프로젝트부터 시작하는 것을 권장합니다. 가장 많이 의존되는 타겟부터 시작하여 최상위 타겟까지 진행하는 것이 좋습니다.