初心者向けCocoaPodsで最低限必要な用語の解説とTips


[CocoaPods](http://cocoapods.org)はiOSのライブラリ管理ツールです。
[CocoaPods](http://cocoapods.org)のインストール自体は簡単なのですが、各用語の関係を把握するのが取っ付きづらいので運用する際に覚えなければいけない最低限の用語をまとめてみました。

インストールについては[ここ](http://d.hatena.ne.jp/Watson/20111204/mac_dev_jp_advent_calendar_cocoapods01)や[ここ](http://qiita.com/makoto_kw/items/edf758a67bd4c2ba5b7a)などがわかりやすかったです。

# 用語解説

## 用語

- Podfile (テキストファイル)
- podspec (テキストファイル)
- Specs (複数のpodspecの集まり)
- [CocoaPods/Specs](https://github.com/CocoaPods/Specs) <公式のSpecs>

## [Specs](http://guides.cocoapods.org/making/private-cocoapods.html)

- [SPEC_NAME].podspecを持つ、決められたディレクトリ構成のGitリポジトリ

```
├── Specs
    └── [SPEC_NAME]
        └── [VERSION]
            └── [SPEC_NAME].podspec
```


## [CocoaPods/Specs](https://github.com/CocoaPods/Specs)

公式のSpecsリポジトリ

- CocoaPodsをインストールした時にデフォルトでクローンされるリポジトリ。保存先は`~/.cocoapods/repos/master`
- 他のSpecsリポジトリを追加したい場合は`$ pod repo add REPO_NAME SOURCE_URL`でクローンの保存先は`~/.cocoapods/repos/REPO_NAME`


## [podspec](http://guides.cocoapods.org/syntax/podspec.html)

- ファイル名は **[SPEC_NAME].podspec**
- どのGitリポジトリのどのファイルをインストールすればいいかを記載したテキストファイル
- 主にtagでバージョンを管理

```
Pod::Spec.new do |spec|
  spec.name         = 'Reachability'
  spec.version      = '3.1.0'
  spec.license      = { :type => 'BSD' }
  spec.homepage     = 'https://github.com/tonymillion/Reachability'
  spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' }
  spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
  spec.source_files = 'Reachability.{h,m}'
  spec.framework    = 'SystemConfiguration'
  spec.requires_arc = true
end
```

## [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html)

- xcodeprojと同じディレクトリに置く
- どのライブラリをインストールするかを記載するテキストファイル
- ライブラリ名だけを記載した場合、`~/.cocoapods/repos/`にクローンしてあるSpecsから一致するものが探される

```
platform :ios,'5.0'
pod 'JSONKit'
pod 'Reachability'
pod 'AFNetworking'
```

### Gitリポジトリを直接指定する方法

```
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
```
*[注意] 指定したリポジトリに[SPEC_NAME].podspecファイルが存在する必要がある*

### ライブラリのインストール

Podfileを置いたディレクトリで`$ pod install`を実行する。

ざっくり以下の様なことが実行される

	1. podfileを検証
	2. ~/.cocoapods/repos/ や 直接GitリポジトリにPodfileに記載されたSpec名の[SPEC_NAME].podspecがあるか
	3. [SPEC_NAME].podspecに従いライブラリをインストール
	4. xcworkspeceを作成

## 用語まとめ

- Podfile (テキストファイル)

    -> **どのライブラリをインストールするかを記載**

- podspec (テキストファイル)

    -> **どのGitからどのファイルをインストールすればいいかが記載**

- Specs (複数のpodspecファイルの集まり)

	-> **決められたディレクトリ構成で各ライブラリのpodspecを持っている**

- CocoaPods/Specs <公式のSpecs>

    -> **インストール時にクローンされるSpecs**



## 関係
1. `Specs`は各ライブラリの`podspecファイル`を持っている
2. `podspecファイル`はそのライブラリのGitリポジトリのURLとインストールに必要なファイルが記載されている
3. `$pod install`をすると`Podfile`に記載されたライブラリの`podspecファイル`を`Specs`から探し取得することにより、各ライブラリをインストールすることができる

# Tips

導入時に実際につまづいたことの解決です。

### [Pod files推奨ディレクトリ構成](http://guides.cocoapods.org/making/making-a-cocoapod.html)

自身のライブラリをpodspecに対応させる場合の推奨ディレクトリ構成

```
├── Assets
├── CHANGELOG.md
├── Classes
    └── ios        <- iOS用のpodspecのspec.source_filesを指定するディレクトリ
    └── osx		 <- OSX用のpodspecのspec.source_filesを指定するディレクトリ
├── Example
    └── Podfile    <- xcodeprojがあるディレクトリ
├── LICENSE
├── README.md
├── Rakefile
└── NAME.podspec
```

### [Podfileのテンプレート](http://qiita.com/u16suzu/items/fd24ee44af16c6986df1)
xcodeprojがあるディレクトリで`$ pod init`を実行するとテンプレートを元にしたPodfileが作成されます。そのカスタマイズ。

### [自前のSpecsの作り方](http://d.hatena.ne.jp/Watson/20111205/mac_dev_jp_advent_calendar_cocoapods02)

### [自前のライブラリ(podspec)をCocoaPods/SpecsにPull Request](http://somtd.hatenablog.com/entry/2013/07/28/163024)

### [pod pushについて](http://efcl.info/2013/1003/res3440/)

### [podspecの書き方例](http://guides.cocoapods.org/making/specs-and-specs-repo.html)

[AFNetworking](https://github.com/CocoaPods/Specs/tree/master/AFNetworking)が実用的で参考になると思います。(subspecの書き方とか)

### [@importを使用している場合、podspecに追加するフラグ](http://stackoverflow.com/questions/19407498/pod-spec-lint-error-unexpected-in-program/19407707#19407707)

`s.compiler_flags = '-fmodules' `

### [プロジェクトからCocoaPodsを削除する](http://stackoverflow.com/questions/16427421/how-to-remove-cocoapods-from-a-project/16427883#16427883)

何か問題があってプロジェクトを`$ pod install`する前の状態に戻したい場合に単純に`Podfile``Podfile.lock``xcworkspace`を削除するだけではだめです。xcodeprojに追加されたスクリプトなども削除しないとビルドが通りません。

# まとめ
自身のライブラリをCocoaPodsに対応させないのであればpodspecを作ることはないです。
公式のCocoaPods/Specsにあるライブラリをインストールしたいだけなら、`xcodeproj`と同じディレクトリにインストールしたいライブラリ名を記載した`Podfile`を作成し、`$ pod install`するだけになります。

がっつり導入する場合にはpodspecやPodfileの書き方など覚えることが多く非常に導入コストがかかると思いますが、それ以上の多大なる恩恵が得られるツールです。最近ではCocoaPodsに対応してないライブラリは導入しないくらいです。
特に一番助かったことは自分のプライベートなライブラリの保守性が非常に高まったことです。