일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- IOS
- init
- Git
- instance
- struct
- url
- 스위프트
- Method
- optional
- property
- enum
- interpace
- Xcode
- Swift
- initializer
- UIKit
- Terminal
- type
- initalizer
- String
- 이니셜라이저
- Unicode
- extension
- 코딩테스트
- Class
- delegate
- tuist
- Protocol
- Foundation
- 디자인패턴
- Today
- Total
아리의 iOS 탐구생활
[iOS/Tuist] Objective-C 코드가 포함된 라이브러리 의존성 주입시 발생하는 문제 본문
YAPP 동아리 21기 iOS 2팀 핏프티 프로젝트를 진행하면서 겪었던 문제입니다.
Tuist 4 버전부터는 발생하지 않으니 참고해주세요.
# 문제 상황
먼저 dependencies에 Amplify 라이브러리 설치를 위해 SPM 목록에 아래와 같이 코드를 추가해주었다.
import ProjectDescription
import ProjectDescriptionHelpers
let dependencies = Dependencies(
carthage: [],
swiftPackageManager: [
.remote(
url: "https://github.com/kakao/kakao-ios-sdk",
requirement: .upToNextMajor(from: "2.13.0")
),
.remote(
url: "https://github.com/Moya/Moya.git",
requirement: .upToNextMajor(from: "15.0.0")
),
.remote(
url: "https://github.com/onevcat/Kingfisher.git",
requirement: .upToNextMajor(from: "7.0.0")
),
.remote( // 추가한 코드.
url: "https://github.com/aws-amplify/amplify-swift.git",
requirement: .upToNextMajor(from: "2.0.0")
)
],
platforms: [.iOS]
)
그리고 tuist fetch 이후 tuist generator를 통해 프로젝트를 실행했더니,
다음과 같은 에러가 발생하면서 빌드에 실패했다.
Could not build Objective-C module 'libtommathAmplify'
'../amplify_tommath.h' file not found
# 이유
일반적으로 tuist에서 지원하는 외부 의존성은 다음과 같다.
- SPM
- Swift Package Manager 를 사용하는 의존성
- Tuist + Swift Package
- Dependencies.swift 를 이용한 Swift Pakcage 의존성
- Tuist + Carthage
- Dependencies.swift 를 이용한 Carthage 의존성
나의 경우 2번째 방식인 Tuist + Swift Package을 통해 라이브러리 의존성을 주입시켜주고 있었다.
하지만 이 방법으로 Objective-C 코드가 포함되어있는 라이브러리 설치 및 의존성 주입을 해주게 되면, 몇가지 파일을 찾지 못하는 경우가 발생한다.
ㅎㅎㅎ....
왜 헤더 파일이 Xcode 내부 경로에 등록되지 않는지는 정확한 이유는 모르겠다. tuist 내부적인 문제 같다.
해당 관련 내용이 tuist 공식 문서에 이슈로 박제되어있다.
아직까지 해결되지 않은 이슈같고… 아래와 같이 별도로 설정해주어야 한다고 설명이 나와있다.
- https://docs.tuist.io/guides/third-party-dependencies#some-notes-on-the-integration-of-swift-packages
- https://github.com/tuist/tuist/issues/3762
- https://github.com/tuist/tuist/issues/4180
하지만 이슈와 해당 내용을 참고해서 설정을 어떻게든 해보려고 했지만…
애초에 나는 Objective-C에 대한 지식도 없으며, 내가 설정을 제대로 한게 맞는건지 조차 잘 파악이 안되서
위 내용으로는 결국 해결하지 못했다.
(혹시 이 글을 보시는 분들 중에 정확한 해결 솔루션을 알고있으시다면... 댓글로 공유해주시면 정말 감사하겠습니다 ㅠㅠ)
# 해결 방법
그래서 내가 해결한 방법은 바로 Dependencies.swift를 이용해서 라이브러리를 설치해주는 것이 아니라,
SPM을 직접 사용해서 라이브러리를 설치해주는 방법으로 해결했다.
먼저 Dependencies.swift 파일에서 SPM 쪽에 라이브러리를 추가해주던 코드를 제거해주었다.
// Dependencies.swift 파일 내부
import ProjectDescription
import ProjectDescriptionHelpers
let dependencies = Dependencies(
carthage: [],
swiftPackageManager: [
.remote(
url: "https://github.com/kakao/kakao-ios-sdk",
requirement: .upToNextMajor(from: "2.13.0")
),
.remote(
url: "https://github.com/Moya/Moya.git",
requirement: .upToNextMajor(from: "15.0.0")
),
.remote(
url: "https://github.com/onevcat/Kingfisher.git",
requirement: .upToNextMajor(from: "7.0.0")
)
/*
// 아래 코드는 제거...
.remote(
url: "https://github.com/aws-amplify/amplify-swift.git",
requirement: .upToNextMajor(from: "2.0.0")
)
*/
],
platforms: [.iOS]
)
그리고 Project.swift에 직접 패키지를 추가하고, 해당 라이브러리의 의존성이 필요한 타겟에 모두 아래와 같이 의존성을 추가해주었다.
// Project.swift 파일 내부
let project = Project.makeModule(
name: "Fitfty",
platform: .iOS,
product: .app,
packages: [ // packages를 추가하여 Amplify 라이브러리 추가
.remote(
url: "https://github.com/aws-amplify/amplify-swift.git",
requirement: .upToNextMajor(from: "2.0.0")
)
],
dependencies: [
.project(target: "Coordinator", path: .relativeToRoot("Projects/Coordinator")),
.package(product: "Amplify"), // 라이브러리 관련 의존성 주입
.package(product: "AWSAPIPlugin"),
.package(product: "AWSDataStorePlugin"),
.package(product: "AWSCognitoAuthPlugin"),
.package(product: "AWSS3StoragePlugin")
],
resources: ["Resources/**"],
infoPlist: .file(path: "Support/Info.plist"),
entitlements: "Fitfty.entitlements"
)
그리고 해당 라이브러리를 사용하는 모든 모듈에 아래와 같이 의존성을 추가해주었다.
// Auth/Project.swift 파일 내부
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project.makeModule(
name: "Auth",
product: .staticFramework,
dependencies: [
.Project.Common,
.Project.Core,
.SPM.Moya,
.SPM.Kingfisher,
.package(product: "Amplify"), // 의존성 추가
.package(product: "AWSCognitoAuthPlugin"),
.package(product: "AWSS3StoragePlugin"),
.package(product: "AWSAPIPlugin"),
.package(product: "AWSDataStorePlugin")
]
)
// 나머지 Core, 메인 화면 등등.. 사용되는 모든 모듈에 의존성을 추가해주었다.
이렇게 설정한 후 tuist clean으로 tuist에서 생성된 모든 파일을 깔끔하게 정리해준 후
tuist fetch를 통해 다시 라이브러리 설치를 해준 다음
tuist generator를 통해 프로젝트를 실행하면 아래와 같은 화면을 확인할 수 있다.
기존에 Xcode에서 수동으로 SPM을 통해 라이브러리 설치를 하면 나타나는 화면과 동일하게 설정되어 있는 모습을 확인할 수 있다.
이 경우, tuist generator를 하면 package 를 resolve한 뒤 프로젝트가 실행된다.
❯ tuist generate
Resolved cache profile 'Development' from Tuist's defaults
Generating workspace Fitfty.xcworkspace
Generating project MainFeed
Generating project Setting
Generating project Common
Generating project Fitfty
Generating project Auth
Generating project Core
Generating project Alamofire
Generating project Coordinator
Generating project Profile
Generating project Onboarding
Generating project Kingfisher
Generating project Moya
Generating project KakaoOpenSDK
Resolving package dependencies using xcodebuild
Project generated.
Total time taken: 4.089s
다시 에러가 났던 경로를 찾아서 들어가면 정상적으로 헤더 파일이 추가되어 있는 것을 확인할 수 있다.
그리고 더이상 발생했던 에러 메세지는 나타나지 않았으며, 빌드도 성공적으로 되었다…
이 문제로 몇일을 삽질했는지 모르겠다…ㅠㅠ
왜 옵젝씨 코드가 포함된 라이브러리는 이런 에러가 나는지 모르겠으나, 하루 빨리 개선되었으면 좋겠다…
왜냐하면 이렇게 설정하면 tuist의 중요한 기능을 사용할 수가 없어 빌드 속도가 늘어나기 때문이다…
당시 해결했던 PR 보러 가기
Reference
제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면, 공감💛 ㆍ 구독✅ ㆍ 공유🔗 ㆍ 댓글✍🏻 부탁드립니다. 🙏🏻
'Swift > 문제해결' 카테고리의 다른 글
[Xcode Cloud] Tuist로 만든 프로젝트에 Xcode Cloud 적용하는 법 (2) | 2022.12.07 |
---|---|
[URLRequst] 네트워크 요청 시 캐시 제어 하는 방법 (1) | 2022.09.23 |
Swift의 String index는 왜 정수가 아니지? 왜 구하기 어려울까? (1) | 2021.09.13 |
Cannot use mutating member on immutable value: function call returns immutable value (0) | 2021.09.13 |
atomically는 프로그래밍에서 무슨 뜻일까... (0) | 2021.09.13 |