LoginSignup
0
0

More than 1 year has passed since last update.

Gemfile.lockのexclamation mark (!)

Last updated at Posted at 2022-08-17

Gemfile.lockのDEPENDENCIESの!

自前のgemサーバーを立てたプロジェクトでGemfileを修正したところ、Gemfile.lockのDEPENDENCIESに!が差分として入るようになったのでその理由を調べてみた。

一応それらしい情報は見つかったものの、説明にバラツキがあり今一つピンと来ない。
https://stackoverflow.com/questions/7517524/understanding-the-gemfile-lock-file

Bundlerは一体何をやっているのか?

仕方ないのでbundlerのソースを確認してみると、こんな感じで!を付けてました。

lib/bundler/dependency.rb
    def to_lock
      out = super
      out << "!" if source
      out << "\n"
    end

sourceの判定

lib/bundler/rubygems_ext.rb
    def source
      (defined?(@source) && @source) || Gem::Source::Installed.new
    end

なるほど・・・

つまりsourceの判定結果次第で!が付く仕組みになっているので、先ほど見たStack Overflowに書いてある内容はどれも概ねあっているけど実際の挙動と微妙に違う、ということになりそうな気がします。

気になるので、一応挙動を確認しておきます。

動作確認

Global Sourceで rubygems.org を指定た状態で、意味はないけどあえてインストールするgemにsourceオプションをつけて同じ rubygems.org を指定してみます。

Gemfile.lock
source "https://rubygems.org"
gem 'rails', source: "https://rubygems.org" # あえてsourceオプションをつけてみる

この状態でbundle installすると、予想通り DEPENDENCIESに ! が付きました。

Gemfile.lock
DEPENDENCIES
  rails!

bundler1.0.0の頃から変更は入ってないようなので大体どのバージョンでも同じ結果になると思います。

まとめ

Global Source以外に:sourceオプションやsourceブロックを使用すると、Gemfile.lockのDEPENDENCIESに!が付くようになる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0