광어네 맛집

[SPM] Swift Package Manager Custom 해서 사용하기 본문

Swift/navigator👨🏻‍✈️

[SPM] Swift Package Manager Custom 해서 사용하기

Lautner Jacob 2022. 6. 24. 15:41
728x90
반응형

진짜 갑자기 몸살에 장염에 걸려서 죽을 뻔 ...

아프지만 글은 남기고 싶은게 있어서 포스팅 작성함!

오늘은 SPM에 대해서 살펴볼까 함

 


 

흔히 우리가 SPM을 사용하는 방법은

Xcode -> Project -> Package Dependancies -> '+'로 추가해서 사용함

근데 만약 Target이 여러개일 때나 각각 framework가 사용하고 싶을 때가 있을 거임

물론 Pods로 분기처리 해줄 수도 있지만 SPM도 가능은 하다~

 

방법은 Xcode -> File -> New -> Package 를 눌러주면

 

이름과 어디에 저장할지가 나오는데

Git Repo에 올려서 사용하고 싶으면 아래 화면처럼 선택해주고 생성해주면 된다!

 

그럼 아래처럼 파일이 만들어지는데 하나씩 뜯어보면 간단하다!

 

먼저 맨 위에서부터 맨 아래로 차근차근 설명함!

let package = Package(
  name: "MyLibrary",
    products: [
        .library(name: "MyLibrary", targets: ["MyLibrary"])
      ]

 

상단에 name: "MyLibrary" 이 부분은 SPM을 설치하면 나오는 이름이다!

 

그 다음 .library( ~~ 여기 부분은 Package를 설치하고 어떤 걸 설치 할지 나오는 부분!

 

그 다음으로 dependencies가 나오는데 products 다음에 오는 친구임!

targets: 에도 나오니까 헷갈리지 마세여!

dependencies: [
],

얘는 우리가 라이브러리 Github 주소를 입력해주는 공간임

 

Xcode에서는 이 주소를 복사해서 아래에 붙여넣기 하면 만들어지는 것과 같음!

 

이제 맨 마지막 Targets 볼 차례임

얘네는 아까 맨 처음에 products에서 .library( ~~ 여기에 들어갈 애들은 만들어 주는 거임

그리고 firebase라고 치면 설치하려고 하면 종류가 여러개가 있잖음? 그걸 선택해주는 공간이기도 함!

(Ex. FirebaseAnalytics, FirebaseMessaging, FirebaseCrashlytics etc...)

targets: [
  .target(name: "MyLibrary", dependencies: [])
  .testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"])
]

 

단 주의할 점은 Target을 추가해줄 때 왼쪽 Navigator에서 폴더를 만들어줘야 함!

swift 열면 별 내용없으니까 이름만 변경해서 복붙해도 될 듯

 

여기까지 차근 차근 만들어줬으면 'Package.resolved'파일을 만들어줄텐데

얘가 'Podfile.lock'라고 생각하면 될 듯!

 

이렇게만 설명하고 끝내면 이해가 안될테니 Sample로 만든 것도 참고해서 이해하시면 좋을 듯해요

// swift-tools-version: 5.6
import PackageDescription

let package = Package(
  name: "SPM Package",
  platforms: [.iOS(.v13)],
  products: [
    // type의 종류는 dynamic, static, none 3가지가 있는데 default가 dynamic이다!
    // pods로 설치할 때와 비교하면 
    // use_framework: -> static / #use_framework: -> dynamic 속성이라고 생각하면 된다!
    .library(name: "AlamoPackage", type: .static, targets: ["AlamoPackage"]),
    .library(name: "OthersPackage", type: .dynamic, targets: ["OthersPackage"]),
  ],
  dependencies: [
    // 여기서는 특정 버전, 최신 버전, 다양하게 설정할 수 있다!
    // name을 사용하는 방법은 deprecate 되었으니 이 방법을 사용하시길
    // 참고로 부속적으로 자동 설치되는 라이브러리도 git주소만 있으면 본인이 설정할 수 있다!
    .package(url: "https://github.com/Alamofire/Alamofire.git", exact: "4.9.0"),
    
    .package(url: "https://github.com/firebase/firebase-ios-sdk.git", exact: "8.15.0"),
    .package(url: "https://github.com/google/GoogleDataTransport.git", exact: "9.1.2"),
    .package(url: "https://github.com/google/GoogleUtilities.git", exact: "7.7.0"),
    .package(url: "https://github.com/google/promises.git", exact: "2.1.0"),

    .package(url: "https://github.com/zendesk/answer_bot_sdk_ios.git", from: "2.2.0"),
    .package(url: "https://github.com/zendesk/chat_sdk_ios.git", from: "2.12.0"),
    .package(url: "https://github.com/zendesk/support_sdk_ios.git", from: "5.5.0"),
    .package(url: "https://github.com/zendesk/sdk_messaging_ios.git", from: "2.4.1"),
  ],
  targets: [
    .target(
      name: "AlamoPackage",
      dependencies: [
        // 여기서 조금 헷갈렸는데 name에는 "패키지 안에 어떤 걸 설치할지 적어주면 된다"
        // 아래 'firebase'를 보면 이해하기 쉬울 듯!
        // package는 위 주소에서 '.git' 앞에 부분을 적어주면 된다
        .product(name: "Alamofire", package: "Alamofire"),
      ]),
    .target(
      name: "OthersPackage",
      dependencies: [
        .product(name: "FirebaseAnalytics", package: "firebase-ios-sdk"),
        .product(name: "FirebaseMessaging", package: "firebase-ios-sdk"),
        .product(name: "FirebaseCrashlytics", package: "firebase-ios-sdk"),
        .product(name: "FirebaseDynamicLinks", package: "firebase-ios-sdk"),
        .product(name: "GoogleDataTransport", package: "GoogleDataTransport"),

        .product(name: "ZendeskAnswerBotSDK", package: "answer_bot_sdk_ios"),
        .product(name: "ZendeskChatSDK", package: "chat_sdk_ios"),
        .product(name: "ZendeskSupportSDK", package: "support_sdk_ios"),
        .product(name: "ZendeskSDKMessaging", package: "sdk_messaging_ios"),
    ]),
  ]
)

 

 

마지막으로 Git repo에 올려도 되고, Project에 직접 추가해서 해줘도 되는데

Xcode Target -> General -> Frameworks, Libraries, and Embedded Content 에 package를 추가해줘야 사용가능하다!

 

근데 얘네들이 DerivedData 여기에 저장되다 보니 수정을 여러번 하면 너무 용량이 순삭되는 느낌 ㅎㅎ..

그리고 안될 때는 'File -> Package -> Reset Package Caches 해보면 될 듯!

 

정리하자면 

장점 : 라이브러리를 개별적으로 설치할 필요없이 하나로 설치가능하다!

단점 : 빠르다고 하는데 'Derived Data' 삭제하면 시간이 좀 걸림!

 

그럼 오늘도 화이팅!

728x90
반응형