はじめてライブラリを作ってCocoa Podsで公開してみた

# はじめに
今までライブラリを作ってCocoa Podsに公開したことがなかったのでやってみました！

# 開発環境
以下の環境でライブラリを作りました。

|Category|Version|
|:---:|:---:|
|Swift|4.1|
|Xcode|9.3 (9E145)|

# 作ったライブラリについて
LSSLoggerというLoggerライブラリを作ってみました。https://github.com/stv-yokudera/LSSLogger
最近開発していたアプリでログをファイル出力する要件があったので、
業務アプリであれば他の開発案件でも使いそうだなーと思ってライブラリ化してみました。

Cocoa PodsまたはCarthageでプロジェクトに導入できます:hugging:

GitHubで:star:押していただけると嬉しいです:joy:

## LSSLoggerでできること
LSSLoggerは、ログ出力を簡単にできるライブラリです。
ログをコンソールへ出力したり、ファイルへ出力したり、またコンソール・ファイル両方への出力が簡単にできます。

## ログレベル
LSSLoggerは、デフォルトでは以下のようにログ出力可否が設定されています。
DEBUGログは、コンソールのみ出力可能で
それ以外のログは、コンソールにもファイルにも出力可能になっています。

| ログレベル | DEBUG | INFO | WARNING | ERROR | FATAL |
| :----: | :----: | :----: | :----: | :----: | :----: |
| コンソール出力 | ◯ | ◯ | ◯ | ◯ | ◯ |
| ファイル出力 | × | ◯ | ◯ | ◯ | ◯ |

サンプルコードです。

```swift:ViewController.swift
import LSSLogger
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // コンソールにDEBUGログを出力(メッセージ無し)
        LSSLogger.console.debug()
        // コンソールにDEBUGログを出力(メッセージ有り)
        LSSLogger.console.debug(message: "foo")
        // コンソールにINFOログを出力
        LSSLogger.console.info(message: "bar")

        // ログファイルにWARNINGログを出力
        LSSLogger.file.warning(message: "foobar")
        // ログファイルにERRORログを出力
        LSSLogger.file.error(message: "xxAPIエラー発生")

        // コンソール・ログファイル両方にFATALログを出力
        LSSLogger.consoleAndFile.fatal(message: "xxで異常終了")
    }
}
```

サンプルコードを実行すると、コンソールには以下のように
`LSSLogger.console`または`LSSLogger.consoleAndFile`で指定したログが出力されます。
ログレベル毎に絵文字がつきます。

![](https://farm1.staticflickr.com/831/41250711725_ce616fda99_c.jpg)

背景が白の場合は以下のように見えます。

![](https://farm1.staticflickr.com/824/41250711385_cd9725fdd0_c.jpg)

また、`LSSLogger.file`または`LSSLogger.consoleAndFile`の場合は
日次ログファイルが生成されて、指定したログが出力されます。
ログファイルに出力するログには、ログレベル毎の絵文字は含みません。

![](https://farm1.staticflickr.com/982/27280640757_bae25b7a57_h.jpg)

![](https://farm1.staticflickr.com/945/42151720761_a43e085bdc_b.jpg)

## ログ設定

### ログローテーション
ログをファイル出力するとき、当日分のログファイルが存在しなければ新しく生成されます。
デフォルトでは、10日分ログファイルを保持する設定になっており、
当日分のログファイル生成時に10日分以上存在した場合は古いものから削除されます。

ログファイルのローテーションを変更する場合は、
`LSSLogger.configureLogRotationCount(count: )`でローテーションカウントを設定します。

```swift:AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // ログファイルのローテーションをデフォルトの10日分から5日分に変更
        LSSLogger.configureLogRotationCount(count: 5)

        return true
    }
```

### Releaseビルドでログを出力させない
Release時にはログを出力したくない、という場合は
以下のように`#if RELEASE ~ #endif`内で、ログ出力設定を変更します。
コンソール出力・ログファイル出力それぞれを不可に設定することができます。

```swift:AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // リリースビルドの場合
        #if RELEASE

        // ログをコンソールに出力させない
        LSSLogger.outputToConsoleEnabled(isEnabled: false)

        // ログをファイルに出力させない
        LSSLogger.outputToFileEnabled(isEnabled: false)
        #endif

        return true
    }
```

`#if RELEASE ~ #endif`を使用する場合は、
プロジェクトファイルのActive Compilation ConditionsのReleaseの項目に
「RELEASE」が設定されていることを確認してください。
![](https://farm1.staticflickr.com/905/42105603842_fd8831e53d_h.jpg)


## 作成する中で躓いたところ
ライブラリを作成する中で躓いたところとして**アクセス修飾子**があります。

普段、プロジェクトを作って開発を進める際には
**private**を設定したりして可能な限りアクセスを狭くするよう心掛けていますが、
ライブラリを作成する場合は外部モジュールからアクセスできるよう**public**にしてあげなければいけませんでした。

メソッドは**public**にしていましたが、クラス自体を**public**にするのを忘れていて
気付くまでに時間を要しました:sob:。。


## 参考
今回、ライブラリを公開するにあたって以下を参考にしました。

### Cocoa Pods
[Getting setup with Trunk](http://guides.cocoapods.org/making/getting-setup-with-trunk.html)
[Cocoa Podsでライブラリを公開するときにpodspec設定で躓いたところ](https://qiita.com/HideakiTouhara/items/e9c871e92f3a034fc1f3)
### Carthage
[Supporting Carthage for your framework](https://github.com/Carthage/Carthage#supporting-carthage-for-your-framework)



## さいごに
今回は、ライブラリを公開することを勉強したかったのでミニマムなライブラリを公開しましたが、
今後ちゃんと計画してもう1つライブラリを作ってみたいと思います。