Library

SPM 라이브러리 생성 및 배포

GREEN.1229 2022. 2. 9. 10:21

안녕하세요. 그린입니다🟢

이번 포스팅에서는 SPM 라이브러리를 생성하여 배포까지 하는 학습을 해보겠습니다💁🏻

 

이전 포스팅에서 CocoaPods으로 라이브러리를 생성하고 배포하고 또 업데이트까지하는 포스팅을 했었는데

https://green1229.tistory.com/215

 

써드파티 라이브러리 만들기

안녕하세요. 그린입니다🟢 이번 포스팅에서는 코코아팟으로 써드파티 라이브러리를 만들어보는 학습을 해보겠습니다🙋🏻 라이브러리를 만든다고 생각하면 너무 거창하다고 생각했는데 막

green1229.tistory.com

요 포스팅과 연관된 일환으로 이번에는 SPM, Swift Package Manager를 통한 라이브러리 배포를 동시에 해보려해요!

보통 코코아팟 혹은 이 SPM을 사용하여 라이브러리를 import해서 사용하는 일이 많기에 SPM 환경으로 셋팅하는것도 중요하다고 생각합니다!

특히 SPM은 애플의 first-party 라이브러리이기에 현재는 코코아팟이 더 우세하고 SPM으로는 지원하지 않는 라이브러리들도 있지만

점차 그런 격차는 줄어들고 있으며 SPM이 라이브러리 환경에서 선두가 되지 않을까 조심스레 생각해봅니다🤔

(코코아팟이나 카르타고에 비해 더 쉽게 설정이 가능하고 다른 장점들이 있지만, 무엇보다 애플에서 만들고 지원하니까요..!💪)

 

들어가기 앞서 저는 위에서 코코아팟을 만들고 현재 보완하고 있는 SuperStepper라는 라이브러리가 이미 있기에 깃헙에 레포를 따로 만들고 등록하고 하는 일련의 과정은 생략하고 이미 있는 플젝에서 SPM 환경을 생성해 추가하는 방향으로 가겠습니다🚀

1. Package file 생성

아래와 같이 명령어를 입력해 Package 파일 및 소스 폴더를 생성해줍니다.

swift package init

여기서 Package.swift 파일은 코코아팟의 podspec파일과 비슷한 역할을 해줍니다.

2. Source 폴더로 cocoapods으로 생성한 라이브러리 폴더 이동

1번의 동작을 수행하면서 Source 폴더가 생성되었어요.

그런데 코코아팟과 SPM에서 파일구조가 다르기에 저 Source폴더로 기존 구현해준 파일을 옮겨줘야해요.

즉 기존에는 이렇게 Source폴더가 생성되면서 아래 동일한 라이브러리명으로 빈껍데기 파일이 생성되어있어요.

그리고 동일 계층에 SuperStepper로 우리가 구현한 라이브러리 코드가 들어간 파일이 존재해요.

이걸 저 Sources폴더로 이사시켜줍시다!

기존 Sources 폴더안에 있던 폴더와 파일은 지워주고 아래 SuperStepper 폴더를 그대로 하위로 이동시켜줘요.

이러면 끝!

다만, 현재 SPM으로 맞추느라고 코코아팟의 경로가 바뀌었기에 다시 재설정해줘야합니다.

3. Cocoapods 소스파일 경로 재지정

podspec 파일을 들어갑니다.

s.source_files = 'SuperStepper/Classes/**/*'

기존에는 요렇게 경로가 설정되어 있었을거에요.

그런데 우리는 한단계 Sources라는 경로가 생겼기에 이를 추가해줍니다.

s.source_files = 'Sources/SuperStepper/Classes/**/*'

만약 이렇게 했는데도 Pods에서 swift 파일을 찾을 수 없다고 오류가 난다면

저는 해당 라이브러리 swift파일을 원래 팟의 위치에도 심어주는 작업을 거쳤습니다.

(그러면 되지만 정확한 원인까지는 아직 모르겠네요! 버그인듯한데)

4. Package 파일 수정

여기서부터는 옵션 설정이라 원한다면 진행하시면 됩니다ㅎㅎ

코코아팟에서는 podspec이라는 파일에서 버전이라던지 경로 등 라이브러리의 설정들을 해줬었죠?

동일하게 SPM에서는 Package 파일에서 진행해줍니다.

그럼 간단히 Package 파일에서 어떤 코드를 건드려야 될지 보시죠!

- name

name: "SuperStepper"

네임은 라이브러리명을 따라가기에 딱히 건들일은 없을것 같아요.

- products

products: [
  // Products define the executables and libraries a package produces, and make them visible to other packages.
  .library(
    name: "SuperStepper",
    targets: ["SuperStepper"]),
]

라이브러리 패키지를 정의해줍니다.

- dependency

dependencies: [
  // Dependencies declare other packages that this package depends on.
  // .package(url: /* package url */, from: "1.0.0"),
]

이건 해당 SPM 라이브러리를 사용할때 다른 라이브러리 사용을 한다면 여기 의존성으로 추가해줍니다.

뭐 Moya나 RxSwift 등 그런걸 사용할때 추가해주면 될것 같아요.

저는 아직 없으니 패스!

- platform

platforms: [.iOS(.v14)]

어느 플랫폼에서 어떤 버전부터 가능할것인지 설정해줍니다.

저는 iOS 14부터!

- swiftLanguageVersions

swiftLanguageVersions: [.v5]

스위프트 언어 버전 지원에 관한겁니다.

저는 Swift 5부터 지원합니다.

 

이렇게 설정해주면 끝입니다!

이제 코코아팟 라이브러리 설정때처럼 커밋하고 푸쉬하고 태그 생성하고 코코아팟도 푸쉬해주고!

하면 끝입니다ㅎㅎ

 

마무리

참 코코아팟에 비해서도 간단하죠?

SPM도 이제 지원가능하는 제 라이브러리가 되는걸 보니 뿌듯합니다ㅎㅎ

 

[참고자료]

https://developer.apple.com/documentation/xcode/creating_a_standalone_swift_package_with_xcode

 

Apple Developer Documentation

 

developer.apple.com

https://eunjin3786.tistory.com/107

 

[SPM] 나의 Cocoapod 라이브러리에 Swift Package Manager를 지원해보기

Cocoapod 라이브러리 만들어보기  포스팅을 쓰면서, SPM으로도 이 라이브러리를 import하는 방법을 찾아보고 싶었는데, 기록합니다. ⚠️ 이 포스팅은 저의 의식의 흐름(?) 순서대로 구성되어있으므

eunjin3786.tistory.com