目次
- Rubyのライブラリ
- RubyGemsとは
1.1 Gemfileの-> という記号はどういう意味なのか
- Bundlerとは
2.1 Gemfile/Gemfile.lock/gemspecの違いとは
2.2 bundle install/bundle updateの違いとは
0. Rubyのライブラリ
Rubyのライブラリはgemという形式にまとめてrubygems.orgにて配布されるのが一般的です。
gemには以下のような有用な情報が含まれます。
・ メタデータ。名前、バージョン、説明、著者のメアドなど。
・ 含まれるファイルのリスト
・ 実行ファイルとその場所のリスト (binなど)
・ Rubyのload pathに含まれるべきパスのリスト(lib)など。
・ 必要となる他のライブラリ(依存関係)
最後の「依存関係」というのがGemfileと重なるところ。
Gemが依存関係を記述するときは、名前とバージョンを範囲をリストアップします。
個々で重要なのは依存先ライブラリのソースについては気にしないということです。
1, RubyGemsとは
Rubyに関係するパッケージを総称してRubyGemsといいます。
開発に便利なライブラリやフレームワークをパッケージにし、公開されたそれらはRubylist達は、RubyGems,Gem,Gemsと呼んでいます。
Gemに限らずパッケージの依存関係を管理することが安定のためにも重要です。
1.1 Gemfileの -> という記号はどういう意味なのか
RubyGemsの依存関係を管理してくれるBundlerのGemfile内で使われる~>
という記号はどういう意味なのでしょうか。
Bundler のバージョンは 1.16.1 になります。
例えば次のようなGemfileがあった場合は
source 'https://rubygems.org'
gem `nokogiri`
gem 'rack', '~> 2.0.1`
gem 'rspec'
次の行には~>
が使われています
gem 'rack', '~> 2.0.1`
もしその記号が ~>
ではなく>
であれば2.0.1
より大きいバージョンを,>=
であれば2.0.1
以上のバージョンを指定することになりますが~>
は一体どのようなバージョンを指定することになるのでしょうか.
答えは2.0.1
以上2.1.0
未満のバージョンを指定することになります
なので次のように書き換えることもできます
gem 'rack', '>= 2.0.1', '< 2.1.0'
もう一つの例として, 次のような場合
gem 'nokogiri', '~> 1.4.2'
このように書き換えられます
gem 'nokogiri', '>= 1.4.2', '< 1.5.0'
Gemfile で ~> という記号をを見かけたときはそう言う意味になります
2, Bundlerとは
Bundler の前にまず、Ruby に関係するパッケージを総称して RubyGems といいます。
開発に便利なライブラリやフレームワークをパッケージして
公開されたそれらを Rubyist 達は RubyGems、Gem、Gems と呼んでいます。
Gem に限らずパッケージの依存関係を管理することが安定の為にも重要です。
そして、Bundlerとは、それら依存関係を管理してくれるツールです。
例えば、ある Gem が依存している別の Gem や、それらのバージョン管理であったり、他にも Test や Dev や Pro といった環境ごとに別のバージョンを使用する等に必要となります。
このBundlerもRubyGems
gem install bundler
2.1 Gemfile/Gemfile.lock/gemspecとは
Gemfile
Gemの取得先を記述する
通常はsourceとgemspecの2行、もしくはsourceの1行だけだいい
Gemfile.lockとは
開発環境と運用環境(production)とで同じでgemをインストールするために使います。
bundle
などで自動で生成されます。
installしたgemのversionや取得先が記録される
依存gemのバージョンと取得先が記録されます。
gemspecとは
実際の情報を記述するファイル
Gem::Specification.new do |s|
s.authors = []
s.homepage = ''
・
・
・
gemの依存関係をgemの情報を記述するファイル
s.add_dependency '*****'
s.add_development_dependency '***'
2.2 bundle install/bundle updateの違いとは
bundle install
bundle install
を実行すると、railsはgemfile.lockを元にgemのインストールを行います。
このとき、gemfile.lockに記述されてない、且つgemfileに記述されているgemがある場合、そのgemとそのgemに関連するgemをインストール後、gemfile.lockを更新します。
bundle update
bundle update
を実行すると、Bundlerは、gemfileを元にgemのインストールを行います。その後、gemfile.lockを更新します。
これら二つのコマンドの使い分けについて
bundle update
は文字通り、gemのバージョンを更新する時に使用します。
これは、bundle install
コマンドはgemfile.lockにあるgemについては、更新しないためです。
但し、bundle update
は、本番環境で安易に実行しないでください。
gemのバージョンのズレが起こり、クラッシュする可能性があります。bundle update
は、必ず、ローカル環境で実行してください。
bundle install
は、新しい環境や、gemfileに新しくgemを記述した時に使用します。
参考記事
Bundlerを使ったRubyGemsの依存関係管理
Bundler, Gemfile, Gemfile.lock について
Bundlerを使ったGem管理について
意外とよくわかっていないbundlerについて
Gemfile の ~> という記号はどういう意味なのか
gemspec と Gemfile と Gemfile.lock との違い.
gemspecとGemfileの役割をはっきりさせておく
Gemfile/Gemfile.lock/gemspec/Rakefileそれぞれの違い・役割