自作ライブラリのCarthage（カルタゴ）対応

#はじめに
carthageの対応は簡単というのを聞いたので、やってみるとちょとつまずいたのでメモ。

#環境
* macOS High Sierra 10.13.2
* Xcode9.2 
* swift4

#やり方
[これ(AMNowClockView)](https://github.com/adventam10/AMNowClockView)を例に導入してみます。

1. 新規プロジェクト作成

	<img width="737" alt="car_project.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/b2be82dc-f411-cdb7-844d-ad394e9220bf.png">
Cocoa Touch Frameworkを選択する。

2. ライブラリのファイルを追加

	<img width="270" alt="car_addclass.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/d11b3e08-0a99-236a-ab38-5a36103f6007.png">
ライブラリのクラファイル、xib、リソースなどを追加する。

3. Manage Schemesからsharedにチェック
　<img width="348" alt="car_scheme.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/4f1a95bb-cce4-2b08-d05c-9ba70add6f85.png">
<img width="769" alt="car_shared.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/29fdfbe3-e084-73c9-de26-1fc9bb7d479a.png">

4. 外部アクセスするクラスやプロパティにpublic修飾子をつける
	
	```
	public class AMNowClockView: UIView {

	public var clockBorderLineWidth:CGFloat = 5.0
	}
	```
	何も修飾子をつけない場合、```internal```になるので外部からアクセスしたいものには全て```public```修飾子をつける必要がある。
5. gitにpushする
6. gitにタグをpushする

	ver.1.0とか適当にタグをつけてpushする。（何もない場合エラーになる）

これでライブラリのcarthage対応は完了

#導入方法
1. Homebrewのインストール

	コマンドプロンプトで下記のコマンドを実行する。
	
	```
	/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
	```
	
2. Carthageのインストール

	コマンドプロンプトで下記のコマンドを実行する。
	
	```
	brew install carthage
	```

3. ライブラリを導入するプロジェクトに移動する

	コマンドプロンプトで下記のコマンドを実行してプロジェクトファイルに移動する。
	
	```
	cd プロジェクトファイルのパス
	```
4. Cartfileの生成
	
	コマンドプロンプトで下記のコマンドを実行する。
	
	```
	touch Cartfile
	```
5. Cartfileの編集

	コマンドプロンプトで下記のコマンドを実行する。
	
	```
	vim Cartfile
	```

	キーボードの```i```を押し入力モードにして```github "adventam10/AMNowClockView"```と入力する。
キーボードの```esc```を押して入力モードを解除する。
コマンド```:wq```と入力して、```Enter```で保存して終了する。

	バージョンの指定は下記

	```
	github "adventam10/AMNowClockView" // 最新
	github "adventam10/AMNowClockView" == 2.0 // 2.0
	github "adventam10/AMNowClockView" >= 1.0 // 1.0以上の最新 
	github "adventam10/AMNowClockView" ~> 1.0 // 1.0以上2.0未満の最新 
	```

6. ライブラリをビルドする
	
	コマンドプロンプトで下記のコマンドを実行する。
	
	```
	carthage update --platform iOS
	```
	
	もし下記のようなエラーが出た場合
	
	```
	xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH
	```
	
	コマンドプロンプトで下記のコマンドを実行してパスを設定してやる必要がある。
	
	```
	sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
	```
	
	下記のようなエラーが出た場合

	```
	Carthage requires git 2.3.0 or later.
	```
	
	XCodeのPreferences -> Locations -> Command Line Toolsを指定すると解決しました。

7. プロジェクトにライブラリを追加する

	General→Linked Frameworks and Libraries→＋→Add Other... から下記のようにライブラリを追加する。
	<img width="784" alt="car_add_framework.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/af51cad4-7116-b675-c1c3-e66a900d0659.png">
　　　　　<img width="823" alt="car_path.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/413005b9-5d90-9f33-a8ed-1d2c6daf833b.png">


8. Run Scriptを追加する
	
	build Phases→＋→New Run Script PhaseでRun Scriptを追加する。
	<img width="796" alt="car_add_runscript.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/d53f47bc-08bf-81fd-b8fd-59f630406680.png">
　　　　　<img width="618" alt="car_runscript.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/9298ce62-0c62-0006-446a-951771588033.png">
	上記画像の選択位置に```/usr/local/bin/carthage copy-frameworks```と入力する。
	
	Input Filesに```$(SRCROOT)/Carthage/Build/iOS/AMNowClockView.framework```を追加する
	<img width="691" alt="car_add_inputfiles.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/cc09c825-2293-424a-6405-cc616c4df3de.png">

以上でライブラリの導入は完了

#導入後の問題
1. IBDesignablesとIBInspectablesが無効になる
	
	どうやらコンパイルされると、IBDesignableとIBInspectableの情報がなくなるようです。
	[External Frameworkの@IBDesignable/@IBInspectableを有効にする方法](https://qiita.com/Tueno@github/items/891471566ac5ce872f59)のように有効にする方法もあるようですが、現状は公式な方法で有効にすることは無理なようです。

2. xibのカスタムクラスの設定でエラーになる

	xibのViewのカスタムクラスにライブラリのクラスを設定すると下記のようなエラーになる。
	```Unknown class AMNowClockView in Interface Builder file```
	今まであまり気にしたことがなかったが、どうやら```Module```もちゃんと設定しなければいけないようです。
	<img width="257" alt="car_module.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/4d62efd4-1a6c-dc23-4539-ea6159eee132.png">

3. Command PhaseScriptExecution failed with a nonzero exit code
	
	久々にCarthageを使ったら上のエラーが出たがCarthageのアップデートで解決しました。
	ターミナルで下記コマンドを実行でアップデート

	```
	brew upgrade carthage
	```

#さいごに
IBDesignablesとIBInspectablesが使えないのは残念...

#参考

* [【Swift】Carthage導入手順]
(https://qiita.com/ShinokiRyosei/items/9b856ebdec5379b6c631)
* [Carthageを使ってビルド時間を短縮しよう](https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)
* [External Frameworkの@IBDesignable/@IBInspectableを有効にする方法](https://qiita.com/Tueno@github/items/891471566ac5ce872f59)
* [Carthageを使ってみよう](https://qiita.com/yuukiw00w/items/c5fb57dac6c4acdbf84e)