LocalPackageをXcodeからPackageとして公開する
Xcode11からXcode上でSwift Package Manager
のパッケージを作成・利用できるようになりました。公開されているパッケージをライブラリとして利用したり、プロジェクトのコードの一部をLocal Package
としてプロジェクトから切り離してモジュール化することができます。 私も開発をする際に、コード整理や再利用性も考慮して、共通のextensionやcomponentsをLocal Package
に切り出しています。しかしこのままでは新規にアプリを作成するときに、そのコードをコピーしないといけないので、Local Package
をGitHubにプロジェクトにアップロードし、パッケージとして公開したので、その手順をまとめました。 またプロジェクトのCommit, PushなどのGitの操作をXcodeから操作できるようになり、今回初めて操作したのですが、思ったよりも操作しやすかったので、今回のGitの操作は、Xcodeを利用しています。
- Mac: Big Sur v11.3.1
- Xcode: 12.5
Local Packageを公開する
まずはプロジェクト内にLocal Package
を作成します。 私の場合は、以下のように4つのLocalPackageを作成していました。 それぞれ共通のコンポーネントやextension、ネットワーク処理やUtilsをまとめたものです。 SwiftComponents
はSwiftExtension
に依存しているので、公開するのはそのパッケージにも依存していないものからにします。
準備として、該当のLocal Package をコピーして、
別のディレクトリに移動します。 そしてその中のPackage.swift
をクリックすると、そのパッケージだけをXcodeで開くことができます。 Gitの操作をする前に、ビルドが通るかどうかを確認するために一回ビルドしてみましょう! またREADMEにそのパッケージの情報を記載したい場合は、記載しましょう(私は自分用のパッケージなので、書きませんでした笑) ビルドが通ったら、いよいよパッケージをGitHubにアップします。 上部のメニューから「Source Control」→「New Git Repositories」を選択します。
そしてそのまま、Createします。 そうすると、既存の実装が以下のようにInitial Commit
としてコミットされます。
Xcodeでコミット履歴を確認するためには、Xcodeの左側のメニューの左側から2番目のアイコンをタップして、その後パッケージ名のところを選択します。 次にタグを設定します。 公開されたパッケージを利用できるようにするためには、1.0.0
のようなタグを設定する必要があります。 以下のキャプチャのように、パッケージ名の箇所でメニューを開き、「Tag “main”」を選択します。
そして以下のように例えば1.0.0
などと設定し、タグを作成します。
次にリモートリポジトリを追加します。 今回は新規のリポジトリを作成します。 GitHubにログインしていない場合は、GitHubにログインします。 私の場合は、GitHubのIDとGitHub Personal Access Token
を使用してログインしました。トークンの発行方法は、こちらで確認できます。 あとはリポジトリ名やリポジトリの詳細を記載します。 今回は誰でも閲覧・利用できるパッケージにするので、Visibility
はPublic
にして、Createします。
そして最後にリモートリポジトリにPushします。 Xcodeの上部のメニューの「Source Control」→「Push」を選択します。 以下のような画面が表示されたら、Include tags
にチェックをつけて、Pushします。
これで、Local Package
をGitHubに公開し、どのアプリからでも利用できるようになりました。 既存のLocal Package
を使用しているアプリからそのパッケージを削除し、新規に作成したパッケージのURLを利用して、Remote Package
を追加します。 なお私の場合は、SwiftUtilsなどは上記で追加したSwiftExtensionsに依存しているので、既存のLocal Package
を、新規に作成したRemote Package
に置き換えます。 元々以下のようなPackage.swift
になっているのを、
以下のように、Remote Package
のURLに置き換えます。
これで作業としては、上記と同じことをすることで、このパッケージも公開することができます。 SwiftUtilsの最終的なPackage.swift
は以下のようになりました。
まとめ
今回はローカルで作成したパッケージをGitHubに公開し、別のアプリからでも共通に利用できるようにしました。 個人開発でよく利用するextensionやコンポーネントなどは共通で使いまわせるようにしておくと便利です。 実際の使い方としては、最初はLocal Package
として開発を続け、後々実装が落ち着いた時にRemote Package
として利用するようになると思います。 1つのプロジェクトにすべてのコードや処理をまとめてしまうと、依存性がめちゃくちゃになってしまったり、一部の処理を別のアプリで使おうと思った時に使い回しにくくなってしまう時があります。その時に機能やコンポーネント単位でモジュールとして切り出すと、コードの見通しや再利用性も高まります。 このSwift Package
はApple純正のものでXcodeで公式にサポートされているため、利用しやすいですし、今後も機能追加されていくことが予想されるので、一部機能のモジュール化には非常に利用しやすいと思います。