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

Post on 27-Jul-2015

2.178 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

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

top related