RubyGems と
Bundler について
2018/4/12
大手町.rb #12
大手町.rb #5 発表資料 「RubyGems と Bundler について」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!Ruby関西の中の人
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
大手町.rb の中の人
毎月 大手町.rb の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #5 発表資料 「RubyGems と Bundler について」
今日のテーマ
Bundler と RubyGems 聞いたことはあるはず
こんなことありませんか?
謎の呪文・・・
教えてもらったまま、なんとなくやってる・・・
そういう人向けに基本的なことを説明します
逆に下記のことは解説しません
Gem ファイルの作り方、gemspec の作り方
gem のビルドの仕方
2
大手町.rb #5 発表資料 「RubyGems と Bundler について」
3パッケージ管理システムの例
OS
Red Hat Enterprise Linux系: RPM、Yum
Debian系: dpkg、APT
MacOS: Homebrew、MacPorts
Windows: Chocolatey、PackageManagement、NuGet
言語
Ruby: RubyGems、Bundler
Python: pip、conda
PHP: PEAR、PECL、Composer
大手町.rb #5 発表資料 「RubyGems と Bundler について」
4歴史的な流れ
Ruby Conf 2004 (at Washington D.C.)
RubyGems と Ruby on Rails 、YARV の発表などがあった
Ruby on Rails は複数のコンポーネントから構成される
ActiveRecord、ActionPack、ActiveSupport など
インストールの単純化などのためにパッケージ管理が必須!
Ruby on Rails が RubyGems を正式採用!
当時、 RubyGems 以外にもバージョン管理システムがあったが、
Ruby on Rails の影響もあり、RubyGems がデファクト化
Ruby 1.9 から RubyGems が標準に含まれる
Ruby on Rails は依存gem が多すぎ。
バージョンアップのつらみがすごい
Bundler が登場!
複数バージョンの共存、バージョンアップが簡単になった。
Ruby on Rails 3 から Bundler をデフォルトで採用
大手町.rb #5 発表資料 「RubyGems と Bundler について」
パッケージ管理システムとは
パッケージ管理システムでできること
インストール、アンインストールの管理
依存関係の解決
依存済パッケージの最新化
リポジトリからの指定パッケージの検索
RubyGems
上記のことができる Ruby 用のパッケージ管理システム
gem形式と呼ばれるファイル形式を採用
Bundler
たくさんの gem がどのバージョンを使うかを一元管理可能
Gemfile (使いたいバージョンを指定するファイル)と
Gemfile.lock(Bundler が決定したインストールすべきバージ
ョンを格納したファイル)を使って管理する
5
大手町.rb #5 発表資料 「RubyGems と Bundler について」
RubyGems のコマンド
多くの人は install しか使わないのでは?
例えば、下記コマンドで rake の gem のファイルの中
で def invoke という文字列を検索できる
gem contents rake | xargs fgrep "def invoke"
6
gem --help # ヘルプを表示
gem install bundler # bundler をインストール
gem environment # RubyGems のインストールディレクトリなどを表示
gem contents rake # インストールされたファイルのフルパス一覧を表示
gem list # 手元でインストール済の gem の一覧を表示
gem open rake # 指定した gem を EDITOR で開く
gem pristine rake # 指定した gem を初期状態に戻す
大手町.rb #5 発表資料 「RubyGems と Bundler について」
Bundler がなかったとき、あるとき
Bundler の前の世界
アプリケーションを開発する
当然のように、いくつか外部ライブラリを使う
最初はうまく動いている
あるタイミングから、インストールしたけど、動きませんと報
告が上がってくる
理由を調べたら、依存ライブラリの一部が最新バージョンでは
過去と非互換なふるまいをしていることが判明
バージョンを古い環境で動かしたらちゃんと動いた。
けど、これを各利用者の環境で周知、作業してもらうのは大変
Bundler が誕生したあとの世界
Gemfile を書く
必ず同じ gem のバージョンで動作する
古いプロジェクトでもちゃんと動作する
みんな、幸せ
7
大手町.rb #5 発表資料 「RubyGems と Bundler について」
Bundler を使ったプロジェクトのワークフロー
bundle init で Gemfile を作成する
※ Ruby on Rails のプロジェクトなら不要
Gemfile を編集する
bundle install する
指定バージョンの gem をインストール
Gemfile を編集して、使う gem のバージョンを上げる
bundle install では
conflict発生
bundle update sinatra で conflict 解消
8
> bundle init source 'https://rubygems.org'
gem 'sinatra', '~> 1.3.6'
gem 'rack-cache'
gem 'rack-bug'
> bundle install
source 'https://rubygems.org'
gem 'sinatra', '~> 1.4.5'
gem 'rack-cache'
gem 'rack-bug'
> bundle install
> bundle update sinatra
大手町.rb #5 発表資料 「RubyGems と Bundler について」
Gemfile の例 9
source 'https://rubygems.org' # 使いたい gem リポジトリを指定
source 'https://user:password@gems.example.com' # 社内の gem リポジトリも指定できる
ruby '2.5.1' # 使いたい Ruby のバージョンを指定する
gem 'rails', ">= 5.0.0" # Rails 5.0.0 以上のバージョンを使う
gem 'rails', ">= 5.0.0", "< 5.1" # 5.0.0 以上、5.1 未満のバージョンを使う
gem 'rails', "~> 5.0.0", # 上と同じ(5.0.0 以上、5.1 未満のバージョンを使う)
gem 'rails', "~> 5.0", # 5.0 以上、6 未満のバージョンを使う)
gem 'rspec', :require => false # インストールするけど、require はしない。
gem 'activerecord-session_store', github: 'rails/activerecord-session_store' # github レ
ポを使う。(Bundler 2.0 まで非推奨らしい)
gem 'webmock', group: "test" # bundle install --without test で、インストールを除外できる。
gem 'pry-rails', group: [:development, :test] # 一度に複数の group を指定
group :development, :test do # 複数の group への指定をブロック形式で記述
gem 'pry-doc'
gem 'pry-byebug'
end
大手町.rb #5 発表資料 「RubyGems と Bundler について」
bundle のコマンド 10
> bundle install # 依存関係を解決しつつ、インストール
> bundle update # バージョンを最新化
> bundle update rails # Rails とその依存関係のgem のバージョンのみ最新化。
> bundle exec rails -v # 現在のコンテキストで rails –v を実行
> bundle config # Bundler の設定を表示。レポジトリにアクセスするときのクレデンシャルの設
定のときとかに使う
> bundle binstubs # bin/ ディレクトリに現在のコンテキストで実行する stub を生成
> bundle clean # すでに使われなくなった gem を削除
> bundle list # 現在のコンテキストでの依存関係を含めたすべての gem のリストを表示
> bundle open activesupport # EDITOR で activesupport のディレクトリを開く
> bundle show rake # rake のインストール先のディレクトリを表示
> bundle pristine # ローカルの編集済の gem を初期状態に戻す
> bundle viz # graphviz を使って、依存関係のグラフを PNG で出力する
大手町.rb #5 発表資料 「RubyGems と Bundler について」
良くある開発サイクル
① 依存ライブラリに起因してそうな不具合を発見
② そのメソッドがどこにあるか調査
# 下記のコマンド的な
> gem contents rake | xargs fgrep "def invoke"
> bundle show rake | xargs fgrep –r "def invoke"
③ そのメソッドで binding.pry などして詳細を調査
> gem open rake
> bundle open rake
④ 調査完了したら、gem pristine や bundle
pristine を使って、初期状態に戻す
⑤ gem の記述内容を変更しても安心!
11
大手町.rb #5 発表資料 「RubyGems と Bundler について」
まとめ
今回は、みんな使っているけれど、深くは理解していな
い RubyGems と Bundler について紹介しました。
知らない機能もあったかもしれません。
これからの開発にお役立ちできるとうれしいです。
12
ご清聴ありがとう
ございました

RubyGems と Bundler について

  • 1.
  • 2.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も!Ruby関西の中の人 Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 今日のテーマ Bundler と RubyGems 聞いたことはあるはず こんなことありませんか? 謎の呪文・・・ 教えてもらったまま、なんとなくやってる・・・ そういう人向けに基本的なことを説明します 逆に下記のことは解説しません Gem ファイルの作り方、gemspec の作り方 gem のビルドの仕方 2
  • 4.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 3パッケージ管理システムの例 OS Red Hat Enterprise Linux系: RPM、Yum Debian系: dpkg、APT MacOS: Homebrew、MacPorts Windows: Chocolatey、PackageManagement、NuGet 言語 Ruby: RubyGems、Bundler Python: pip、conda PHP: PEAR、PECL、Composer
  • 5.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 4歴史的な流れ Ruby Conf 2004 (at Washington D.C.) RubyGems と Ruby on Rails 、YARV の発表などがあった Ruby on Rails は複数のコンポーネントから構成される ActiveRecord、ActionPack、ActiveSupport など インストールの単純化などのためにパッケージ管理が必須! Ruby on Rails が RubyGems を正式採用! 当時、 RubyGems 以外にもバージョン管理システムがあったが、 Ruby on Rails の影響もあり、RubyGems がデファクト化 Ruby 1.9 から RubyGems が標準に含まれる Ruby on Rails は依存gem が多すぎ。 バージョンアップのつらみがすごい Bundler が登場! 複数バージョンの共存、バージョンアップが簡単になった。 Ruby on Rails 3 から Bundler をデフォルトで採用
  • 6.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 パッケージ管理システムとは パッケージ管理システムでできること インストール、アンインストールの管理 依存関係の解決 依存済パッケージの最新化 リポジトリからの指定パッケージの検索 RubyGems 上記のことができる Ruby 用のパッケージ管理システム gem形式と呼ばれるファイル形式を採用 Bundler たくさんの gem がどのバージョンを使うかを一元管理可能 Gemfile (使いたいバージョンを指定するファイル)と Gemfile.lock(Bundler が決定したインストールすべきバージ ョンを格納したファイル)を使って管理する 5
  • 7.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 RubyGems のコマンド 多くの人は install しか使わないのでは? 例えば、下記コマンドで rake の gem のファイルの中 で def invoke という文字列を検索できる gem contents rake | xargs fgrep "def invoke" 6 gem --help # ヘルプを表示 gem install bundler # bundler をインストール gem environment # RubyGems のインストールディレクトリなどを表示 gem contents rake # インストールされたファイルのフルパス一覧を表示 gem list # 手元でインストール済の gem の一覧を表示 gem open rake # 指定した gem を EDITOR で開く gem pristine rake # 指定した gem を初期状態に戻す
  • 8.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 Bundler がなかったとき、あるとき Bundler の前の世界 アプリケーションを開発する 当然のように、いくつか外部ライブラリを使う 最初はうまく動いている あるタイミングから、インストールしたけど、動きませんと報 告が上がってくる 理由を調べたら、依存ライブラリの一部が最新バージョンでは 過去と非互換なふるまいをしていることが判明 バージョンを古い環境で動かしたらちゃんと動いた。 けど、これを各利用者の環境で周知、作業してもらうのは大変 Bundler が誕生したあとの世界 Gemfile を書く 必ず同じ gem のバージョンで動作する 古いプロジェクトでもちゃんと動作する みんな、幸せ 7
  • 9.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 Bundler を使ったプロジェクトのワークフロー bundle init で Gemfile を作成する ※ Ruby on Rails のプロジェクトなら不要 Gemfile を編集する bundle install する 指定バージョンの gem をインストール Gemfile を編集して、使う gem のバージョンを上げる bundle install では conflict発生 bundle update sinatra で conflict 解消 8 > bundle init source 'https://rubygems.org' gem 'sinatra', '~> 1.3.6' gem 'rack-cache' gem 'rack-bug' > bundle install source 'https://rubygems.org' gem 'sinatra', '~> 1.4.5' gem 'rack-cache' gem 'rack-bug' > bundle install > bundle update sinatra
  • 10.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 Gemfile の例 9 source 'https://rubygems.org' # 使いたい gem リポジトリを指定 source 'https://user:password@gems.example.com' # 社内の gem リポジトリも指定できる ruby '2.5.1' # 使いたい Ruby のバージョンを指定する gem 'rails', ">= 5.0.0" # Rails 5.0.0 以上のバージョンを使う gem 'rails', ">= 5.0.0", "< 5.1" # 5.0.0 以上、5.1 未満のバージョンを使う gem 'rails', "~> 5.0.0", # 上と同じ(5.0.0 以上、5.1 未満のバージョンを使う) gem 'rails', "~> 5.0", # 5.0 以上、6 未満のバージョンを使う) gem 'rspec', :require => false # インストールするけど、require はしない。 gem 'activerecord-session_store', github: 'rails/activerecord-session_store' # github レ ポを使う。(Bundler 2.0 まで非推奨らしい) gem 'webmock', group: "test" # bundle install --without test で、インストールを除外できる。 gem 'pry-rails', group: [:development, :test] # 一度に複数の group を指定 group :development, :test do # 複数の group への指定をブロック形式で記述 gem 'pry-doc' gem 'pry-byebug' end
  • 11.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 bundle のコマンド 10 > bundle install # 依存関係を解決しつつ、インストール > bundle update # バージョンを最新化 > bundle update rails # Rails とその依存関係のgem のバージョンのみ最新化。 > bundle exec rails -v # 現在のコンテキストで rails –v を実行 > bundle config # Bundler の設定を表示。レポジトリにアクセスするときのクレデンシャルの設 定のときとかに使う > bundle binstubs # bin/ ディレクトリに現在のコンテキストで実行する stub を生成 > bundle clean # すでに使われなくなった gem を削除 > bundle list # 現在のコンテキストでの依存関係を含めたすべての gem のリストを表示 > bundle open activesupport # EDITOR で activesupport のディレクトリを開く > bundle show rake # rake のインストール先のディレクトリを表示 > bundle pristine # ローカルの編集済の gem を初期状態に戻す > bundle viz # graphviz を使って、依存関係のグラフを PNG で出力する
  • 12.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 良くある開発サイクル ① 依存ライブラリに起因してそうな不具合を発見 ② そのメソッドがどこにあるか調査 # 下記のコマンド的な > gem contents rake | xargs fgrep "def invoke" > bundle show rake | xargs fgrep –r "def invoke" ③ そのメソッドで binding.pry などして詳細を調査 > gem open rake > bundle open rake ④ 調査完了したら、gem pristine や bundle pristine を使って、初期状態に戻す ⑤ gem の記述内容を変更しても安心! 11
  • 13.
    大手町.rb #5 発表資料「RubyGems と Bundler について」 まとめ 今回は、みんな使っているけれど、深くは理解していな い RubyGems と Bundler について紹介しました。 知らない機能もあったかもしれません。 これからの開発にお役立ちできるとうれしいです。 12
  • 14.