ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Tuist] 모듈 생성 과 모듈 내 테스트 타겟 생성
    개발/Swift 2025. 1. 14. 22:07

    모듈을 생성해서 개발할 예정이다

    (Tuist edit 한 후)

    메인앱 타겟을 보면 여러 디펜던시들이 세팅되어있다

    외부 라이브러리를 포함한다

    dependencies: [TargetDependency] {
            return [            
                .external(name: "AdFitSDK"),
                .external(name: "AMPopTip"),
                .external(name: "ChannelIOSDK"),
                .external(name: "CocoaLumberjack"),
                .external(name: "CocoaLumberjackSwift"),
    						....
    						]
    

    여기에 모듈을 만들 project 를 하나 넣어준다

    Entity 모듈과 기능모듈을 넣어줬다

    .project(target: "MyProfile", path: .relativeToRoot("Projects/MyProfile")),
    .project(target: "Entity", path: .relativeToRoot("Projects/Entity")),
    
    

    그러고 Project 폴더 내부에 위와 같은 폴더를 만들고 Project.swift 생성한다

    세팅은 비교적 간단했다

    //Entity Project 파일
    
    import TemplatePlugin
    import ProjectDescription
    import TargetPlugin
    
    let project = Project(
        name: "Entity",
        settings: .librarySettings,
        targets: [
            .target(
                name: "Entity",
                destinations: .iOS,
                product: .staticFramework,
                bundleId: "com.Entity.Entity",
                sources: [
                    .glob(.path("Sources/**"))
                ],
                dependencies: [],
                settings: .settings(
                    base: [
                        "DEFINES_MODULE": "NO",
                    ]
                )
            )
        ]
    )
    
    //MyProfile Project 파일
    
    let project = Project(
        name: "MyProfile",
        settings: .librarySettings,
        targets: [
            .target(
                name: "MyProfile",
                destinations: .iOS,
                product: .staticFramework,
                bundleId: "com.MyProfile.MyProfile",
                sources: [
                    .glob(.path("Sources/**"))
                ],
                dependencies: [
                    .project(target: "Entity", path: .relativeToRoot("Projects/Entity")),
                    .external(name: "ComposableArchitecture"),
                    .external(name: "RxSwift"),
                ],
           
                settings: .settings(
                    base: [
                        "DEFINES_MODULE": "NO",
                    ]
                )
            )
        ]
    )
    
    

    product 를 staticFramework로 지정했는데 framework로 하면 런타임에 EXC_BAD_ACCESS 에러가 났다.

    원인은 좀 알아봐야겠다.

    위에서 또 중요한건 Sources 폴더 만들고 경로 지정해주는것이다.

    그리고 필요한 dependencies , 지금 만들 Entity를 의존해야하므로 추가했고

    외부 라이브러리 추가했다.

    settings는 configutation, info쪽에 들어가는 내용같은데

    이미 있는게있어서 사용했다

    static let librarySettings: Settings = .settings(
        base: [
            "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER": "NO",
            "DEVELOPMENT_TEAM": "39MSJ7FY3F",
            "EXCLUDED_ARCHS[sdk=iphonesimulator*]": ["x86_64"],
            "IPHONEOS_DEPLOYMENT_TARGET": "15.0",
            "ONLY_ACTIVE_ARCH": "YES",
            "TARGETED_DEVICE_FAMILY": "1",
        ],
        configurations: [
            .debug(name: "AppStore Debug"),
            .release(name: "AppStore Release"),
            .debug(name: "Development Debug"),
            .release(name: "Development Release"),
        ]
    )
    
    

    이러고 tuist generate 하면 모듈이 딱 들어와있었다.

    모듈에서 테스트 환경 만들기

    개발중에 테스트 코드를 짜려하는데 유닛테스트 코드에 지정할 타겟이 없었다

    tuist edit → 아까 만든 Project 파일에 들어가서

    let project = Project(
        name: "MyProfile",
        settings: .librarySettings,
        targets: [
            .target(
                name: "MyProfile",
                destinations: .iOS,
                product: .staticFramework,
                bundleId: "com.MyProfile.MyProfile",
                sources: [
                    .glob(.path("Sources/**"))
                ],
                dependencies: [
                    .project(target: "Entity", path: .relativeToRoot("Projects/Entity")),
    
                    .external(name: "ComposableArchitecture"),
                    .external(name: "RxSwift"),
                ],
           
                settings: .settings(
                    base: [
                        "DEFINES_MODULE": "NO",
                    ]
                )
            ),
            .target(
                name: "MyProfileTests",
                destinations: .iOS,
                product: .unitTests,
                bundleId: "com.MyProfile.MyProfileTests",
                sources: [
                    .glob(.path("Tests/**"))
                ],
                dependencies: [
                    .target(name: "MyProfile")
                ],
           
                settings: .settings(
                    base: [
                        "DEFINES_MODULE": "NO",
                    ]
                )
            )
        ]
    )
    
    

    target 하나 더 추가, unitTest 타입으로 만들고

    source, dependencies 세팅했다.

    그러고 프로젝트 내부에 Tests폴더 생성하고

    generate 해보니 타겟이 생성되었다.

     

    Tests 폴더 안에 테스트 코드 넣고 타겟 멤버쉽 을 test 로 설정


    그리고 테스트 필요한 함수는 public 으로 지정되어야 사용 가능했다

    같은 모듈이어도 타겟 다르니 internal 접근이 안되었다.

     

     

    댓글

Designed by Tistory.