Skip to main content
  1. Posts/

Swift Packageの作り方① - 新規作成から実装まで

Swift Packageの作り方がある程度わかったので、ここらでまとめておきたいと思います。 今回はパッケージの新規作成から、実装までをまとめます。公開方法については記載しません。

参考にしたリソース #

新規作成の方法 #

まずはパッケージを作成します。2通りの方法があります。

Xcodeで新規作成する場合 #

画面上部のメニューから、File > New > Packageを選択します。

次に、パッケージの名前を指定し、保存先を選択します。「Create」をクリックすると、ディレクトリが作成され、その中にパッケージのファイルが作成されます。

パッケージがXcodeの画面に展開され、実装ができるようになります。

CLIで新規作成する場合 #

まずは、パッケージのディレクトリを作成します。

$ mkdir "${PACKAGE_DIR_NAME}" && cd "${PACKAGE_DIR_NAME}"

コマンドでは、パッケージのディレクトリ名を意図的に変数で書いていますが、直書きで問題ありません。 ディレクトリ名は、Gitのリポジトリ名のつもりで考えて問題ありません。 また、公開せずアプリのプロジェクトでしか使用しない場合であれば AppFeatureApplicationDomainModelのような名前でも問題ないでしょう。

次に、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.swiftSourcesTestsのディレクトリが作成されます。細かくみていくと、以下のようになっています。

- Package.swift
- Sources
  - TargetA
    - 〇〇.swift
  - TargetB
    - 〇〇.swift
- Tests
  - TargetATests
    - 〇〇Test.swift
  - TargetBTests
    - 〇〇Test.swift

Package.swiftSoucesの関係を見ると、Package.swifttargets: [.target(name: "ターゲット名")で指定する名前が、Sources/ターゲット名になっているようです。 Testsのディレクトリも同様に、Package.swifttargets: [.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ディレクトリも削除します。

次に、改めてアプリのターゲットを作成します。サンプルの意図が伝わりやすい名前にします。 今回は、SampleForSwiftUISampleForUIKitという名前でアプリターゲットを作成してみました。

これで、パッケージのディレクトリ構成が、わかりやすくなりました。

- 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.swiftproducts: [.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に切り出していけば、普段開発するアプリの構成をスッキリさせていけそうな期待があります。 プロジェクト内のターゲットとして切り出すよりもスッキリできそうです。 ライブラリの公開方法についてはまだ試していませんが、今後試してみて、備忘録としてまとめたいと思います。

公式のドキュメントも、改めて読んでみようと思います。