ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション開発チームのテックブログです

SwiftPackageManagerによるライブラリの導入をしてみた

はじめまして、LDIのモバイルアプリエンジニアの庄司です。

今回はLDIの開発でSwiftPackageManager(SPM)を導入したため、導入方法を紹介していきます。

この記事はSPMを導入したいと思ってる人向けです。

導入経緯

テストフレームワークのNimbleとQuickをCarthageで導入していましたが、

Xcode12.3にアップデートしたところ、ビルドエラーになってしまいました。。。

理由を調べてみると、Xcodeが複数プラットフォーム向けのバイナリを格納したFrameworkに非対応になっていました。それを解決するためにSPMを導入しました。

元々はCarthageで管理しており、Carthageで対応できないものはCocoaPodsで管理していたため、SPMでのライブラリの導入はこれまでしていませんでした。

環境

  • Xcode12.3
  • Swift 5.3
  • macOS Catalina 10.15.x

導入手順

SwiftPackageManagerでライブラリを追加する方法

ここではNimbleの追加を例として手順を追っていきます。

  1. .xcodeprojを開いて、対象のProjectのSwift Packagesを選択

f:id:ldi-contributor:20210319155938p:plain

  1. ”+”をクリックすると設定用ウィンドウが開きます

  2. 入力窓に導入するライブラリのリポジトリURLを入力する

f:id:ldi-contributor:20210319160113p:plain

  1. 使用するバージョン等の設定を行いNextをクリック

f:id:ldi-contributor:20210319160409p:plain

  1. 追加対象のTargetを確認してFinishをクリック

f:id:ldi-contributor:20210319160512p:plain
Add to Targetの欄で追加するTargetを選択できる

注意点

  • バージョン管理対象に追加するもの

Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved に追加したライブラリのバージョンなどの情報が保存されます。 SPMはPackage.resolvedに記録されたバージョンのライブラリを追加するように動作するため、VCS(GitやSVN)の管理対象に追加が必要です。

下記が今回のPackage.resolvedの内容です。追加したNimbleのリビジョンやバージョンが記録されています。

{
  "object": {
    "pins": [
      {
        "package": "CwlCatchException",
        "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git",
        "state": {
          "branch": null,
          "revision": "f809deb30dc5c9d9b78c872e553261a61177721a",
          "version": "2.0.0"
        }
      },
      {
        "package": "CwlPreconditionTesting",
        "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git",
        "state": {
          "branch": null,
          "revision": "02b7a39a99c4da27abe03cab2053a9034379639f",
          "version": "2.0.0"
        }
      },
      {
        "package": "Nimble",
        "repositoryURL": "https://github.com/Quick/Nimble.git",
        "state": {
          "branch": null,
          "revision": "e491a6731307bb23783bf664d003be9b2fa59ab5",
          "version": "9.0.0"
        }
      }
    ]
  },
  "version": 1
}

感想

Xcodeに依存したツールなので外部ツールのバージョンをあまり気にしなくても良く、Podfile、Cartfileを書かなくても良い点が楽だと思いました。