cocoapoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
TRANSCRIPT
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