아리의 iOS 탐구생활

[iOS/Tuist] Objective-C 코드가 포함된 라이브러리 의존성 주입시 발생하는 문제 본문

Swift/문제해결

[iOS/Tuist] Objective-C 코드가 포함된 라이브러리 의존성 주입시 발생하는 문제

Ari Lee 2023. 2. 27. 23:10
반응형
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 공식 문서에 이슈로 박제되어있다.

아직까지 해결되지 않은 이슈같고… 아래와 같이 별도로 설정해주어야 한다고 설명이 나와있다.

하지만 이슈와 해당 내용을 참고해서 설정을 어떻게든 해보려고 했지만…
애초에 나는 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 보러 가기
 

[Feature] Amplify 라이브러리 설치 및 AmplifyManager 구현 by leeari95 · Pull Request #31 · YAPP-Github/21st-iOS-Team-

📕 Issue 관련 이슈를 연결합니다. fix x 📙 작업 내역 구현 내용 및 작업 했던 내역, 변경 사항을 포함합니다. 라이브러리 Amplify 설치 tuist+SPM으로 라이브러리 의존성 추가 시 에러가 발생합니다. [

github.com

 

 

 

Reference

 

Adding external dependencies | Tuist Documentation

Learn how to define the contract between the dependency managers and Tuist.

docs.tuist.io

 

Tuist 로 외부 의존성 관리하기

오늘은 많은 분들이 질문해주셨던 Tuist 3.x 버전에서 변경된 외부 의존성 관리에 대해 알아보려고 합니다.

okanghoon.medium.com

 

SPM external dependency SDWebImageSwiftUI fails to build · Issue #3762 · tuist/tuist

Describe the bug I created a dummy project depending on SDWebImageSwiftUI using SPM interface, and when I try build it, it fails. Error logs are like this: ❌ /Users/user/Library/Developer/Xcode/Der...

github.com

 

[Dependencies.swift]: cannot use external dependencies from ObjectiveC code · Issue #4180 · tuist/tuist

Describe the bug Our project uses the well known CocoaLumberjack framework for logging. We come from CocoaPods and are converting to Tuist and its Dependencies. Our main project still has quite som...

github.com

 

 

 

 

제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,  공감💛 ㆍ 구독✅ ㆍ 공유🔗 ㆍ 댓글✍🏻  부탁드립니다. 🙏🏻
반응형
Comments