SlideShare a Scribd company logo
CocoaPoderと賢者の宝石
∼ まだ bundle exec で消耗してるの? ∼
@niwatako on Twitter
+
にわとり
タコクラゲ
I ♡ クラゲ
Apple Watch で クラゲが泳ぐ
Apple Watch 最高
CocoaPoderと賢者の宝石
∼ まだ bundle exec で消耗してるの? ∼
よく見かける

CocoaPoderの悲鳴
• みんな違うバージョンのCocoaPodsを使っていて 

Podfile.lock の行末バージョン表記が異なって困る
• CocoaPodsバージョンアップしたせいで動かない
• bundle exec が面倒
• bundle exec の alias を作ったったwww
Rubyの仕組みで
解決できる。
CocoaPodsとは
– @IT
生産性ガチアゲな

iOSライブラリ管理の神ツール
コマンドで簡単に

Xcodeプロジェクトへ

ライブラリを組み込む

ことが出来る
$ sudo gem install cocoapods

$ pod setup
CocoaPodsのインストール
platform :ios, "6.0"
pod 'AFNetworking', ' > 2.0'
PROJECT_DIR/Podfile
$pod install
Podfileに書いた

ライブラリが取得され、

プロジェクトに組み込まれる。
便利 (/・ω・)/
だが今の手順は

良くない。
CocoaPodsの正体
Rubyというプログラミング言語で作られた、

CocoaPodsというライブラリ

( Ruby Gem  ※Gem=宝石)
ココアポッダーは
Rubyを使っています
$ sudo gem install cocoapods
$ sudo gem install cocoapods
管理者権限を使用している
$ sudo gem install cocoapods
管理者権限を使用している
Macに

標準で入ったRubyを使っているから

gem追加に管理者権限を要している
標準のRubyを使っている
とは
$ which ruby
$ which ruby
/usr/bin/ruby
こんな人は

システムのRubyを

使っている人(=゚ω゚)ノ
Mac に標準で入っている

Rubyに依存している。
だが、Rubyのバージョンは
Mac OS のバージョンによって

異なる可能性がある
例えば
Mountain Lion は Ruby 1 系
Mavericks は Ruby 2 系
ある日突然、OSにつられて
メジャーバージョン

が 変わる
システムRuby ユーザーは
一体 Ruby の

何を信じているのか。
こんなモノへの依存は
排除すべし
やるべきこと1
$ sudo gem install cocoapods
$ sudo gem install cocoapods
RubyにCocoaPodsライブラリを追加
$ sudo gem install cocoapods
RubyにCocoaPodsライブラリを追加
グローバルに

CocoaPodsが入ってしまう
むかーしのプロジェクトを触る時、

今のバージョンのCocoaPodsで

いいんですか?
$ gem install cocoapods

する人は
一体 CocoaPods の

何を信じているのか。
こんな方法への依存は
排除すべし
やるべきこと2
$ bundle install
別の方法について
$ bundle install
Bundler という Ruby の
ライブラリ管理ツール
$ bundle install
Bundler という Ruby の
ライブラリ管理ツール
Ruby版CocoaPod、
というか
こっちが本家。
CocoaPodがPodfileに
必要なライブラリを書くように、
BundlerはGemfileに
必要なライブラリを書く。
Gemfileに cocoapods を書いて
$ bundle install すれば 

cocoapods がインストールされる
$ bundle install
$ bundle install
正解の可能性と
過ちの可能性
2つのチェックポイント
• Gemグローバルインストールしていないか

=プロジェクトのディレクトリ内に

 インストールしたGemを閉じ込めているか
• bundle exec … して消耗していないか

=省略出来る。

 知らずに繰り返すと指を痛めるリスクが高まる
グローバルインストール
していないか
Bundlerは放っておくと
グローバルにGemを追加してしまう。
グローバルインストール
していないか
Bundlerは放っておくと
グローバルにGemを追加してしまう。
グローバルインストール
していないか
Bundlerは放っておくと
グローバルにGemを追加してしまう。
何を信じているのか。
グローバルインストール
していないか
ProjectAのために

インストールしたGemが
ProjectBにも適用される。
気づかぬうちに無いはずのGemを使ってしまったり

他プロジェクトによって別VerのGemに

上書きされる恐れ
グローバルインストール
していないか
適切な設定やオプションで

Gemを ディレクトリローカル に

インストールさせることが出来る
グローバルインストール
していないか
プロジェクトが

互いの環境から 独立 して

エレガントになる
グローバルインストール
していないか
だから

$ bundle install
は正解の可能性がある。
グローバルインストール
していないか
しかし
ディレクトリローカルに

インストールしたGemは
PATHが通っておらず

直接実行出来ない。
bundle exec で
消耗していないか
bundle exec pod… などと
bundler を介すると実行できる
bundle exec で
消耗していないか
だが

bundle exec
は打ちにくい。
bundle exec で
消耗していないか
繰り返すと最悪

指を痛める。
bundle exec で
消耗していないか
やるべきこと3
こんなコマンドへの依存は
排除すべし
それでは
はじめましょう
Harry Potter
and
the Philosopher's Gem
エコで(グローバル環境を汚さない)
独立した(システム環境に依存しない)
再現性のある(誰のPCでも動く)
Rubyを使ったプロジェクトの作り方
できるようになること
プロジェクトごとに
利用するRubyを分ける
Rubyのバージョンを
コードで管理する
プロジェクトごとに
利用する gem を
独立させる
bundler で gem を
ディレクトリローカル

に 管理する
bundle exec を

省略する
指に優しく
_人人 人人_
> 消耗しない <
 ̄Y^Y^Y^Y ̄
できるようになること
∼1∼
Rubyのバージョンを
コードで管理する
rbenv
Ruby環境を
総合的に管理できる
rbevnでできる事
• 複数の異なるバージョンのRubyを

同一PC内で時と場合によって切り替えながら

使用することが出来る
• ディレクトリに .ruby-version ファイルを設置して

コードによって このディレクトリで使うRuby を

指定できる。
rbenvを使った
トータルでエレガントな
Ruby環境構築をしよう
rbenvをインストール
• MacPortsをアンインストール(もしあれば)
• Xcode Command line tools をインストール
• Homebrewをインストール
• rbenvのインストール
• rbenvを使ってRubyをインストール
細かくはWEBで
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
この記事がわかりやすいらしいですよ
この記事がわかりやすいらしいですよ
※私の記事です
rbenvつかってrailsチュートリアルやってみよう!
http://niwatako.tips/20140724/article121.html
rbenv と Ruby のインストール
# インストールできるRubyの一覧

$ rbenv install -l
# インストール

$ rbenv install 2.1.2
# インストール済みの一覧

$ rbenv versions

* system

1.9.3-p547

2.0.0-p481

2.1.2
使用するRuby バージョンを

指定する
# システム全体で使うバージョンを指定

$ rbenv global 1.9.3-p125
# Mac標準のRubyに戻す

$ rbenv global system
# 特定のディレクトリで使うバージョンを指定

$ rbenv local 1.9.3-p125
使用するRuby バージョンを

指定する
# システム全体で使うバージョンを指定

$ rbenv global 1.9.3-p125
# Mac標準のRubyに戻す

$ rbenv global system
# 特定のディレクトリで使うバージョンを指定

$ rbenv local 1.9.3-p125
重要
$ rbenv local 2.1.2
.ruby-version
カレントディレクトリに生成される
$ cat .ruby-version
2.1.2
rbenv を使っていれば、
そのディレクトリの .ruby-version に書かれたRubyが
自動で有効になる
インストールしていない

Rubyのバージョンが

記載されていたら
$ ruby 

rbenv: version `2.1.3' is not installed
Rubyを実行しようとしても
rbenvが止めてくれる
rbenvを標準開発環境として採用し
各プロジェクトで
.ruby-version をリポジトリにコミットすれば
誰のどの端末で clone / checkout しても

開発環境のRubyのバージョンが担保される
Rubyのバージョンを
コードで管理する
Rubyのバージョンを
コードで管理する
クリア!
∼2∼
bundler で gem を
ディレクトリローカル

に 管理する
bundler を使いましょう。
Gemfile を書いて bundle install
bundle install 時に
オプションを付ける
$ bundle install --path=vendor/bundle
カレントディレクトリ

(Gemfileがあるプロジェクトルート)の

vendor/bundle ディレクトリに

インストールした gem を詰め込む
$ bundle install --path=vendor/bundle
カレントディレクトリ

(Gemfileがあるプロジェクトルート)の

vendor/bundle ディレクトリに

インストールした gem を詰め込む
$ bundle install --path=vendor/bundle
インストールされたgemは

このプロジェクトでのみ有効。
環境にやさしい。
bundler で gem を
ディレクトリローカル

に 管理する
bundler で gem を
ディレクトリローカル

に 管理する
クリア!
∼3∼
指に優しく
カレントディレクトリ

(Gemfileがあるプロジェクトルート)の

vendor/bundle ディレクトリに

インストールした gem を詰め込む
$ bundle install --path=vendor/bundle
インストールされたgemは

このプロジェクトでのみ有効。
カレントディレクトリ

(Gemfileがあるプロジェクトルート)の

vendor/bundle ディレクトリに

インストールした gem を詰め込む
$ bundle install --path=vendor/bundle
インストールされたgemは

このプロジェクトでのみ有効。
PATHが通らない
$ bundle exec …

で実行が必要
rbenv にプラグインを

入れる
git clone git://github.com/
ianheggie/rbenv-binstubs.git
/.rbenv/plugins/rbenv-binstubs
あとは bundle install に

オプションを追加
--binstubs=vendor/bin
$ bundle install

--path=vendor/bundle

--binstubs=vendor/bin
vendor/bin に

bundle install した gem の

実行ファイルが入り、

自動でパスが通るようになる
bundle exec 不要に!
ちなみに、これらのオプション
 --path=vendor/bundle

 --binstubs=vendor/bin
は、プロジェクトルートの

.bundle/config

の中に記録されていて、
2度目以降はオプション不要な上、
リポジトリにコミットして

コードで管理できる。
指に優しく
指に優しく
クリア!
補足
rbenvの面倒な所
gemをインストールするなど
構成に変更を加える度
$ rbenv rehash
コマンドの実行が必要
新たなる消耗要因!!
プラグインで解決しましょう
git clone https://github.com/
sstephenson/rbenv-gem-rehash.git
/.rbenv/plugins/rbenv-gem-rehash
rbenv rehash が必要なタイミングで
自動で rbenv rehash してくれる。
まとめ
rbenvを使って快適Ruby環境
• Rubyのバージョン管理はrbenvが人気
• rbenvでプロジェクトごとに独立したRuby環境を作れる
• rbenvはプロジェクトのRuby環境をコードで管理出来る
• rbenvはプラグインで便利に。
• rbenv-binstubs で bundle exec による消耗を回避
• rbenv-gem-rehash で rbenv rehash による消耗を回避
rbenv
Ruby
OS
User
Ruby X.X.X Ruby Y.Y.Y
Bundler Bundler
Project A
cocoapods
User User
Ruby Y.Y.Y
Bundler
B
gem
gemgem
gem gem
上級編
RubyGem 信じるんですか?
DNSimpleがDDoS攻撃受けて仕事が出来ない
GitHubがDDoS攻撃受けて仕事ができない
Gem開発者が勝手にGemの名前変えて行方不明
Gem消えた
冪等性とは何だったのか
$ bundle package
vendor/cacheフォルダにgemがキャッシュされる。
$ bundle install --local
vendor/cacheフォルダからgemをインストールする。
gemをローカルにキャッシュして

ローカルから復元する方法がある!
_人人 人人_
> 想定の範囲内 <
 ̄Y^Y^Y^Y ̄
bundler、素晴らしい。
でも bundler 信じるんですか?
・・・bundler自体手に入らなかったら?
bundle install --standalone
bundlerがない環境でも動くようになるらしい。
まだ、調べきれていません。。。
Ruby、homebrew、rbenv
信じるんですか?
宿題
┐(́ω`)┌
紹介
CPU、半導体エンジニアから

インフラ、WEB、スマホアプリまで
フルスタックハウス…!!
ギークハウスに住んでます
風呂の順番待ちを
iBeaconで解消
furobeacon
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜

More Related Content

PDF
Xcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidev
PDF
Xcode 再入門「Xcode の検索機能」 #さいたまdev
KEY
Ojag20120811
PDF
KINECT de DEPLOY
PDF
ときには起こせよエクセプション
PDF
Node-RED on SAKURA cloud
PDF
Pre react native0504
PDF
Ansible softlayer
Xcode 5 で見つけた「どうでもいい」機能(厳選6つ) #cocoa_kansai, #yidev
Xcode 再入門「Xcode の検索機能」 #さいたまdev
Ojag20120811
KINECT de DEPLOY
ときには起こせよエクセプション
Node-RED on SAKURA cloud
Pre react native0504
Ansible softlayer

What's hot (12)

PDF
Chef+serverspec+werckerでインフラCIする話
PDF
Arduino jenkins
PDF
cocos2d-x で PlugAir を 使えるようにしてみた
PDF
Node redをはじめてみよう
PDF
Node red basic & node-red-ug-japan
PDF
Getting started with Handoff
PDF
Wolcome to swift
PPTX
おうちハックのすゝめ
PPTX
ゲームインフラコンテナ実践導入
PDF
Enchant.js入門
PPTX
知ってますか? Azure IoT Edge
PDF
Infrastrucure as a CodeにおけるJenkinsの役割
Chef+serverspec+werckerでインフラCIする話
Arduino jenkins
cocos2d-x で PlugAir を 使えるようにしてみた
Node redをはじめてみよう
Node red basic & node-red-ug-japan
Getting started with Handoff
Wolcome to swift
おうちハックのすゝめ
ゲームインフラコンテナ実践導入
Enchant.js入門
知ってますか? Azure IoT Edge
Infrastrucure as a CodeにおけるJenkinsの役割
Ad

Similar to CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜 (20)

PDF
rvm でbundlerと仲良くする
PDF
PDF
RubyGems と Bundler について
KEY
Bundler kanazawa.rb meetup #2 2012/09/19
PDF
Sinatra and heroku for mac
PDF
RubyGems と Bundler について
PDF
Emacsを使ってrubyのwebアプリを作って見た!!
ODP
ビルドの話 福井技術者のつどい #fukuitech
ODP
Ruby build
PDF
ruby for better bash
PPTX
start Heroku
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
KEY
Real world rails
PDF
Summary of Ruby
PDF
恋に落ちるデプロイツール
PDF
Ruby In Wheezy
PDF
Carton について何か話す
PDF
GitHubで学ぶバージョン管理
PDF
Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報
PDF
Mina 20130417
rvm でbundlerと仲良くする
RubyGems と Bundler について
Bundler kanazawa.rb meetup #2 2012/09/19
Sinatra and heroku for mac
RubyGems と Bundler について
Emacsを使ってrubyのwebアプリを作って見た!!
ビルドの話 福井技術者のつどい #fukuitech
Ruby build
ruby for better bash
start Heroku
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Real world rails
Summary of Ruby
恋に落ちるデプロイツール
Ruby In Wheezy
Carton について何か話す
GitHubで学ぶバージョン管理
Getting Started With Ore-Ore Swift Standard Library ++ ほんのり続報
Mina 20130417
Ad

CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜