SlideShare uma empresa Scribd logo
1 de 145
Baixar para ler offline
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で
この記事がわかりやすいらしいですよ
この記事がわかりやすいらしいですよ
※私の記事です
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 で消耗してるの? 〜

Mais conteúdo relacionado

Mais procurados

Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話Chef+serverspec+werckerでインフラCIする話
Chef+serverspec+werckerでインフラCIする話Masayuki Morita
 
cocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみたcocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみたHideyuki TAKEI
 
Node redをはじめてみよう
Node redをはじめてみようNode redをはじめてみよう
Node redをはじめてみようrina0521
 
Node red basic & node-red-ug-japan
Node red basic & node-red-ug-japanNode red basic & node-red-ug-japan
Node red basic & node-red-ug-japanHarada Kazuki
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with HandoffYuichi Yoshida
 
Wolcome to swift
Wolcome to swiftWolcome to swift
Wolcome to swiftKyohei Ito
 
おうちハックのすゝめ
おうちハックのすゝめおうちハックのすゝめ
おうちハックのすゝめKosuga Masakatsu
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入Hiroki Tamiya
 
知ってますか? Azure IoT Edge
知ってますか? Azure IoT Edge知ってますか? Azure IoT Edge
知ってますか? Azure IoT EdgeSaki Homma
 
Infrastrucure as a CodeにおけるJenkinsの役割
Infrastrucure as a CodeにおけるJenkinsの役割Infrastrucure as a CodeにおけるJenkinsの役割
Infrastrucure as a CodeにおけるJenkinsの役割Takashi Honda
 

Mais procurados (12)

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

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

Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 
Windows7でもchefしたい!
Windows7でもchefしたい!Windows7でもchefしたい!
Windows7でもchefしたい!Tamie YAMAMOTO
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Makoto Nishimura
 
SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! Koji Shiraishi
 
Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Microsoft Corporation
 
Xcode4 project template (slide)
Xcode4 project template (slide)Xcode4 project template (slide)
Xcode4 project template (slide)Wataru Kimura
 
Babelで先取り次世代javascript
Babelで先取り次世代javascriptBabelで先取り次世代javascript
Babelで先取り次世代javascriptTsuyoshi Maeda
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!Midori Oge
 
AngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合ったAngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合ったpastelInc
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfesTakeshi Komiya
 
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来Kazuto Kusama
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかaxsh co., LTD.
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 

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

Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
Introduction of Rhodes
Introduction of RhodesIntroduction of Rhodes
Introduction of Rhodes
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Windows7でもchefしたい!
Windows7でもchefしたい!Windows7でもchefしたい!
Windows7でもchefしたい!
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介
 
Rbenv
RbenvRbenv
Rbenv
 
SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発!
 
Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法
 
Xcode4 project template (slide)
Xcode4 project template (slide)Xcode4 project template (slide)
Xcode4 project template (slide)
 
Sinatra and heroku for mac
Sinatra and heroku for macSinatra and heroku for mac
Sinatra and heroku for mac
 
Babelで先取り次世代javascript
Babelで先取り次世代javascriptBabelで先取り次世代javascript
Babelで先取り次世代javascript
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
AngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合ったAngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合った
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes
 
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来
ひしめき合うOpen PaaSを徹底解剖! PaaSの今と未来
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
Dockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんかDockerの改修を一緒にやりませんか
Dockerの改修を一緒にやりませんか
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 

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