CocoapodsにPrivateのフレームワークを作ってみる

# はじめに
株式会社ピー・アール・オーのアドベントカレンダー3日目です。

今までiOSプロジェクトを開発時、共通で使えるユーティリティクラスを既存のプロジェクトからコピーして、新しいプロジェクト側に流用する形でした。しかし、ユーティリティクラスに修正や機能追加が入った場合、全てのプロジェクトにファイル更新を行う必要があり、効率は良くないです。

そこで、共通のユーティリティークラスをフレームワーク化し、Cocoapods経由で全てのプロジェクト内にインストールすれば今後楽になると思いました。フレームワークのソースコードは公開できない場合もあるため、CocoapodsにPrivateのフレームワークを作成する方法を調べて、作ってみました。

# 事前準備
- Cocoapodsのインストール

```
sudo gem install cocoapods
```

# プライベートのSpecリポジトリを作成する
さて、一番最初に用意する必要があるのはSpecリポジトリです。今回はGitHub上にリポジトリを用意します。
※リポジトリ自体はpublicにする必要がないです。ただし、チームメンバー全員リポジトリのアクセス権限を持つ必要があります。
今回は`pro-specs`のリポジトリを作りました。

## 作成したSpecリポジトリをローカルのCocoapodsに追加する
Specのリポジトリを作成した後、次は作成したリポジトリをローカルのCocoapodsに追加する必要があります。

```
pod repo add [リポジトリ名] [リポジトリのURL]

例）
pod repo add pro-specs https://github.com/lxlgarnett/pro-specs.git
```

## 追加したリポジトリが正しく追加されたかどうかをチェックする

```
cd ~/.cocoapods/repos/[リポジトリ名]
pod repo lint .

例）
cd ~/.cocoapods/repos/pro-specs
pod repo lint .
```
下のメッセージが表示すれば問題ないです。

```
All the specs passed validation.
```

# フレームワークリリース用podspecファイルを作成する
次はリリース用のpodspecファイルを作成します。
※ここはすでにGitHubにリリース済みのプロジェクトが存在することを想定します。

まずは任意の場所に移動し、podspecファイルを作成します。
今回はDesktopにファイルを作成します。

```
cd ~/Desktop
touch Sample.podspec
```

Sample.podspecの中身は下記になります。

```
Pod::Spec.new do | spec |
    spec.name = 'Sample'
    spec.version = '1.0.0-alpha'
    spec.license = { :type => 'MIT' }
    spec.homepage = 'https://www.pro-japan.co.jp/'
    spec.authors = { 'Xiaolei Li' => 'g.rei@pro-japan.co.jp' }
    spec.summary = 'Qiita用サンプルフレームワーク'
    spec.source = { :git => 'https://github.com/lxlgarnett/sample-ios-framework.git', :tag => 'v1.0.0-alpha' }
    spec.source_files = 'Sample/*.swift'

    spec.platform  = :ios, '14.0'

    spec.swift_version = '5.0'
end
```

- spec.name: フレームワーク名、podspecのファイル名はsepc.nameと同じにする必要があります。
- spec.version: バージョン
- spec.license: ライセンス
- spec.homepage: ホームページの情報
- spec.authors: 作成者
- spec.summary: フレームワークの説明
- spec.source: ソースコードの場所
- spec.source_files: 実際podに取り込むファイルのパスとファイルの形式

上記の項目は必須項目です。

# 作成したpodspecファイルをリモート上のSpecリポジトリにプッシュする

```
pod repo push pro-specs ~/Desktop/sample.podspec


Validating spec
 -> Sample (1.0.0-alpha)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning
    - NOTE  | [iOS] xcodebuild:  note: Building targets in parallel
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating the `pro-specs' repo


Adding the spec to the `pro-specs' repo

 - [Add] Sample (1.0.0-alpha)

Pushing the `pro-specs' repo
```
問題がなければ、上記のようにリポジトリに追加したのメッセージが表示されます。

# 公開したフレームワークを使ってみる
実際リリースしたフレームワークを利用する場合、プロジェクト内のPodfileに作成したSpecのリポジトリを追加し、フレームワーク名とバージョンを指定し、podインストールすればOKです。

```
source "https://github.com/lxlgarnett/pro-specs.git"

target 'ProjectName' do
    pod 'Sample' => '1.0.0-alpha'
end
```

# 最後に
共通のソースコードをフレームワーク化すれば、変更があったとしても、全てのプロジェクト内もPodfileに記載したバージョンを更新するだけで、最新のコードが利用できますので、作業の効率が良くなります。

# 参考サイト
[Cocoapodsのインストール](https://guides.cocoapods.org/using/getting-started.html)
[Cocoapods Private Pods](https://guides.cocoapods.org/making/private-cocoapods.html)