Help us understand the problem. What is going on with this article?

RubyGems,Gemfile,Bundler,Gemfile.lockなどについて

目次

  1. Rubyのライブラリ
  2. RubyGemsとは
    1.1 Gemfileの-> という記号はどういう意味なのか
  3. 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それぞれの違い・役割

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした