rbenvを使ってる開発者が新規iOSプロジェクトのためにBundlerとcocoapodsを入れる手順

rbenv を普段使ってる開発者がiOSのプロジェクトを新規で始める時の手順を書いておきます。

## 要点としては

- 新規でiOSのプロジェクト（.xcodeproj）を作成するところから始める
- rbenvを使っている
- bundlerを新規でインストールする
  - システムのgemsを利用したくない（root権限を変えたりしたくない）
- CocoaPodsをインストールしてGemfile.lockでCocoaPods自体のバージョンを固定したい

## 具体例の手順

具体例として新規プロジェクトでfooを作り、そのディレクトリで作業していきます

```
$ cd foo
```

まずrbenvでruby2.5.0をローカルで利用

```
$ rbenv local 2.5.0
$ rbenv rehash
```

補足、ここではruby 2.5.0を利用しましたが、rubyのバージョンが特定のバージョンである必要性が出てくるのはiOSアプリ開発ではレアケースなので何でも良いと思います。ただし、`rbenv local system` としてしまうと、システムのgemsにbundlerをインストールしようとして権限の問題でエラーになります。

ローカルで利用するバージョンの確認

```
$ rbenv versions
  system
  2.2.2
  2.2.4
  2.4.1
* 2.5.0 (set by /Users/yimajo/dev/foo/.ruby-version)
```

bundlerをインストールします

```sh
$ gem install bundler
```

rbenvがインストールされていてパスが設定されていれば`rbenv exec`は必要はなく、`gem install bundler` で充分です[^1]。

[^1]: パスは例えばfishなら `~/.config/fish/config.fish`に`rbenv init - | source`を追記します


bundlerがインストールされたかの確認

```sh
$ which bundle
/Users/yimajo/.rbenv/shims/bundle
```

次にbundleを初期化する。これでGemfileの雛形も用意される

```sh
$ bundle init
```

（`rbenv exec bundle init` としない理由は後述）

Gemfileの雛形ができてるので確認

```sh
$ vim Gemfile
```

```
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
```

cocoapodsを入れるため`gem "cocoapods"`を追記 

```
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem "cocoapods"
```

次にcocoapodsをインストール

```
$ bundle install --path vendor/bundle

（もしくは次のようにconfigすると、configファイルをカレントディレクトリに作りインストールの設定がそこを参照できるようになります）
$ bundle config --local path vendor/bundle
$ bundle install
```

cocoapodsを初期化してPodfileが欲しい

```
$ bundle exec pod init
```

Podfileの雛形がカレントディレクトリにできるので確認


```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'foo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for foo

  target "fooTests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

あとは自分の使いたいpodを記載するだけ。例えば `pod 'APIKit'`や`pod 'HydraAsync'`なら下記のようにして


```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'foo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for foo
  pod 'APIKit'
  pod 'HydraAsync'

  target "foo' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

podインストールする

```
$ bundle exec pod install
```


# 補足

## `rbenv exec bundle init`のように `rbenv exec`付けないのはなぜか

理由は2つ。

1つはそもそもrbenvを使っている際に使っているシェルにパスを設定していれば必要ないから。

もう1つは、`bundle` のsh自体で `rbenv exec`されているためです。

```
#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export RBENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export RBENV_ROOT="/Users/yimajo/.rbenv"
exec "/usr/local/Cellar/rbenv/1.1.1/libexec/rbenv" exec "$program" "$@"
```

## 必要のないファイルのgit管理について

この手順を行うと下記のファイル/ディレクトリが作成されますが、基本的に他の開発者が必要としないものなので、私は `.gitignore`に追加してgit管理しないようにしています。

- .ruby-version
    - `rbenv local バージョン` で作成されたファイル
    - 他の開発者のrubyバージョンを固定する必要性がなければgit管理しない
- vendor/bundle
    - `bundle install --path vendor/bundle` で作成されたディレクトリ
    - 他の開発者のgemのファイルパスを固定する必要性がなければgit管理しない

たいてい必要なのはCocoaPods自体のバージョンであって、それはGemfile.lockをgitで管理するようにしています。