Vagrantを利用して開発環境を構築している時に、ふと、ホストOSにもRubyをインストールしているけど、Vagrantが要求しているバージョンとあっているのかと疑問に思ったことがありました。
結果は、Vagrantが埋め込みのRubyを持っているので、ホストOS上のRubyは利用されません。
これを伝聞ではなく、自分で確認しておきたくて考えた方法をまとめました。
検証環境
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G29
$ ruby -v
ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin16]
$ which ruby
/Users/stupiddog/.rbenv/shims/ruby
デバッグログによるRubyバージョンの確認
デバッグオプションを指定するとログの始めの数行に、各種バージョンの情報が出力されます。
しかし、ベースとなる環境に同じバージョンのrubyをインストールしている場合に区別がつきません。
$ vagrant --debug 2>&1 | head -n 10
INFO global: Vagrant version: 1.9.5
INFO global: Ruby version: 2.2.5
INFO global: RubyGems version: 2.4.5.1
INFO global: VAGRANT_OLD_ENV_GIT_DIFF_OPTS="-U0"
INFO global: VAGRANT_OLD_ENV_EDITOR="vim"
INFO global: VAGRANT_OLD_ENV___CF_USER_TEXT_ENCODING="0x1F5:0x1:0xE"
INFO global: VAGRANT_OLD_ENV_XPC_FLAGS="0x0"
INFO global: VAGRANT_OLD_ENV_PS1="\\n\\h@\\u \\[\\e[0;33m\\]$(__git_ps1) \\[\\e[0;32m\\]\\w\\[\\e[00m\\] \\$ "
INFO global: VAGRANT_OLD_ENV_RBENV_SHELL="bash"
INFO global: VAGRANT_OLD_ENV_TMPDIR="/var/folders/p3/yx7d8t1n2cb416lm0nnmkvgc0000gn/T/"
VagrantFileによる確認
Vagrantの設定ファイルであるVagrantFileは、rubyのコードとして実行されます。
なので、通常のrubyのコードで各種パスの取得を記述します。
RbConfigライブラリを利用して、Rubyインタプリタ実行時に設定された情報を取得します。
Rbconfig.rubyは、rubyコマンドのフルパスを返します。
– VagrantFileの先頭に2行追加します。
require "rbconfig"
puts "[ruby]:" + RbConfig.ruby
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
end
– VagrantFileが処理されれば良いので、VagrantFileの妥当性をチェックして実行させます。
$ vagrant validate
[ruby]:/opt/vagrant/embedded/bin/ruby
Vagrantfile validated successfully.
$ /opt/vagrant/embedded/bin/ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin13]
これで、必要な情報が整いました。
まとめ
検証環境には「/Users/stupiddog/.rbenv/shims/ruby」にあるruby version 2.2.6rubyがあり、Vagrantが実行に利用したのは「/opt/vagrant/embedded/bin/ruby」にあるruby version 2.2.5であることが確認できました。
おまけ
Vagrant埋め込みのrubyは、いつインストールされているのか
Vagrantの製品アーカイブ(.pkg)ファイルの中に含まれていて、Vagrantインストール時に合わせてインストールされます。
[macOS] .dmg & .pkgファイルの中身を確認する方法で、.pkgファイルの中身を確認すると、rubyが含まれているのが分かります。
$ hdiutil attach vagrant_2.0.0_x86_64.dmg
期待される結果 CRC32 $07F4946A
/dev/disk2 GUID_partition_scheme
/dev/disk2s1 Apple_HFS /Volumes/Vagrant
$ pkgutil --payload /Volumes/Vagrant/vagrant.pkg | grep "/lib/ruby/" | head -n 10
./embedded/lib/ruby/2.3.0
./embedded/lib/ruby/2.3.0/abbrev.rb
./embedded/lib/ruby/2.3.0/base64.rb
./embedded/lib/ruby/2.3.0/benchmark.rb
./embedded/lib/ruby/2.3.0/bigdecimal
./embedded/lib/ruby/2.3.0/bigdecimal/jacobian.rb
./embedded/lib/ruby/2.3.0/bigdecimal/ludcmp.rb
./embedded/lib/ruby/2.3.0/bigdecimal/math.rb
./embedded/lib/ruby/2.3.0/bigdecimal/newton.rb
./embedded/lib/ruby/2.3.0/bigdecimal/util.rb
Vagrant version 2.0.0に付いてくるrubyのバージョンは、2.3.0系というのが、なんとなく分かります。
これを、実際にインストール(バージョンアップ)すると、古いバージョンが消えて新しいバージョンになっているのが確認できます。
$ vagrant validate
[ruby]:/opt/vagrant/embedded/bin/ruby
Vagrantfile validated successfully.
$ /opt/vagrant/embedded/bin/ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-darwin13]