Swift Packageの作り方① - 新規作成から実装まで
Table of Contents
Swift Packageの作り方がある程度わかったので、ここらでまとめておきたいと思います。 今回はパッケージの新規作成から、実装までをまとめます。公開方法については記載しません。
参考にしたリソース #
- Swift Packageを中心とした構成に変えて、良かったこと・困ったこと | BLOG - DeNA Engineering
- Swift Packagesでライブラリを自作する方法 - Qiita
- Swift Package Manager (SwiftPM) で作るコマンドラインツール - Qiita
新規作成の方法 #
まずはパッケージを作成します。2通りの方法があります。
Xcodeで新規作成する場合 #
画面上部のメニューから、File > New > Package
を選択します。
次に、パッケージの名前を指定し、保存先を選択します。「Create」をクリックすると、ディレクトリが作成され、その中にパッケージのファイルが作成されます。
パッケージがXcodeの画面に展開され、実装ができるようになります。
CLIで新規作成する場合 #
まずは、パッケージのディレクトリを作成します。
$ mkdir "${PACKAGE_DIR_NAME}" && cd "${PACKAGE_DIR_NAME}"
コマンドでは、パッケージのディレクトリ名を意図的に変数で書いていますが、直書きで問題ありません。
ディレクトリ名は、Gitのリポジトリ名のつもりで考えて問題ありません。
また、公開せずアプリのプロジェクトでしか使用しない場合であれば AppFeature
やApplication
やDomainModel
のような名前でも問題ないでしょう。
次に、swift package init
を実行します。
$ swift package init --name "${PACKAGE_NAME}" --type "${PACKAGE_TYPE}"
--name
パラメータにはパッケージ名を指定します。先ほど作成したディレクトリと同じ名前である必要はありません。しかし、同じ方がわかりやすいでしょう。
--type
パラメータで指定できる値は5種類あります。empty
, library
, executable
, system-module
, manifest
の5種類です。
おそらく多くの場合はlibrary
を指定することになるでしょう。なお、デフォルト値はlibrary
です。
これで、パッケージの新規作成は完了です。
生成されたPackage.swift
を開くと、XcodeがインストールされていればXcodeが立ち上がります。パッケージをXcodeで開発することができます。
$ open Package.swift
以前のXcodeでは、パッケージをダイレクトに開くことができませんでした。
swift package generate-xcodeproj
を実行することで、.xcodeproj
ファイルを生成し、Xcodeで開発できるようにしていました。
現在は、このコマンドはDeprecatedになっています。
Swift Packageのディレクトリ構成 #
Swift Packageを新規作成すると、Package.swift
・Sources
・Tests
のディレクトリが作成されます。細かくみていくと、以下のようになっています。
- Package.swift
- Sources
- TargetA
- 〇〇.swift
- TargetB
- 〇〇.swift
- Tests
- TargetATests
- 〇〇Test.swift
- TargetBTests
- 〇〇Test.swift
Package.swift
とSouces
の関係を見ると、Package.swift
のtargets: [.target(name: "ターゲット名")
で指定する名前が、Sources/ターゲット名
になっているようです。
Tests
のディレクトリも同様に、Package.swift
のtargets: [.testTarget(name: "テストターゲット名")]
で指定する名前が、Tests/テストターゲット名
になっているようです。
Exampleアプリのプロジェクトを作成する #
ライブラリとして公開することを念頭にする場合は、サンプルのアプリプロジェクトも用意すると親切です。 今回は、先ほど作成したディレクトリの1階層下に、Examplesプロジェクトを作成することにします。
Xcodeでメニューから File > New > Project
を選択し、「App」のProjectを選択します。ここから先は、いつもアプリを作る時と同じフローです。
プロジェクトを作成するディレクトリは、先ほど作成したディレクトリです。
こうすることで、Examples
ディレクトリがパッケージのルートに自動で作成されます。
最終的なディレクトリの構成は以下のようになります。
- Package.swift
- Examples
- Examples.xcodeproj
- Examples
- ExamplesApp.swift
- ...
- Sources
- Tests
さて、Examples/Examples
というディレクトリ構成になっています。これではサンプルの意図が伝わりにくいかもしれません。
Examples.xcodeproj
を開いたら、Examples
ターゲットを削除してしまいましょう。Examples
ディレクトリも削除します。
次に、改めてアプリのターゲットを作成します。サンプルの意図が伝わりやすい名前にします。
今回は、SampleForSwiftUI
やSampleForUIKit
という名前でアプリターゲットを作成してみました。
これで、パッケージのディレクトリ構成が、わかりやすくなりました。
- Package.swift
- Examples
- Examples.xcodeproj
- SampleForSwiftUI
- SampleForSwiftUIApp.swift
- ...
- SampleForUIKit
- AppDelegate.swift
- ...
- Sources
- Tests
今回は、Examplesプロジェクトを1つで構成していますが、サンプルプロジェクトを複数用意する方法でも問題はないと思います。
Workspaceを作成し、パッケージとサンプルプロジェクトをまとめる #
サンプルプロジェクトを実装しつつパッケージを開発すると、実際の使い心地を試しながら開発していくことができそうです。
Workspaceを作って、サンプルプロジェクトとパッケージをXcodeの1つのウィンドウで表示できるようにします。
Xcodeのメニューから File > New > Workspace
を選択し、ワークスペースを作成します。
今回は、パッケージ名と同じ名前でワークスペースを作ってみます。 ディレクトリ構成は以下のようになります。
- SwiftPackagePractice.xcworkspace
- Package.swift
- Examples
- Sources
- Tests
作成が完了すると、まっさらなXcode画面が表示されます。そうしたら、先ほど作成したパッケージとサンプルプロジェクトを、ドラッグ&ドロップでワークスペースに登録します。
登録し終えたら、ワークスペースを再起動します。再起動することで、パッケージやExampleのディレクトリが読み込まれるようです。 これで、パッケージとサンプルプロジェクトを同時に開発していくことができます。
あとはいつも通り、依存を追加しインポートするだけ #
残りの作業はいつも通りです。サンプルプロジェクトの方では、パッケージへの依存を追加し、ソースコードでインポートするだけです。
ちなみに、この「Choose frameworks and libraries to add」の画面で表示される名前は、Package.swift
のproducts: [.library(name:"ライブラリ名", targets: [])]
で指定しているライブラリ名のようです。
インポートする名前はターゲット名になります。
これで、サンプルプロジェクトとパッケージを同時に開発していける状態になりました。
応用 - Packageで構成するアプリプロジェクト #
今回の方法を応用すると、以下のようなディレクトリ構成で、アプリプロジェクトを作ることができそうです。
- MyApplication.workspace
- MyApp
- MyApp.xcodeproj
- MyApp
- MyApp.swift
- Feature
- Package.swift
- Sources
- FeatureA
- FeatureB
- Tests
- MoreFeature
- Package.swift
- Sources
- MoreFeature
- Tests
この構成の良さは、アプリプロジェクトがスッキリしているところにあります。 xcodeprojで管理するソースコードが少なくなるため、xcodeprojでコンフリクトが発生しにくくなります。 機能の追加もパッケージに閉じ込めることができるので、テストもしやすくなりそうです。
まだ試していないので、改めてこの構成を試してみたいと思っています。
Swift Packageでライブラリ作ってみよう #
Swift Packageでライブラリを作る方法がわかりました。Swift Packageに切り出していけば、普段開発するアプリの構成をスッキリさせていけそうな期待があります。 プロジェクト内のターゲットとして切り出すよりもスッキリできそうです。 ライブラリの公開方法についてはまだ試していませんが、今後試してみて、備忘録としてまとめたいと思います。
公式のドキュメントも、改めて読んでみようと思います。