CentOSにJekyllを入れる
CentOS 8にJekyllを入れようとしたら、依存関係などが意外と面倒だったので、ちょっと整理。
やりたいことは、ただこれだけ。
- 素のCentOSにRubyを入れて、
- JekyllのGemを入れて、
- jekyll new mysiteでサイトひな形を生成して、
- bundle exec jekyll serveで動かす。
確認にはVagrantのcentos/8(VirtualBox版)を使用した。
VM構築直後に下記でパッケージ全体を最新化して再起動しているので、CentOSのバージョンは8.1.1911。
sudo dnf upgrade
dnfでRubyを入れ、gemでJekyllを入れる場合
- Rubyは古いバージョン(2.5.5)が入る。
- Bundlerが自動では入らないので(Rubyに標準添付されるようになったのは2.6から)、自分でgem installする。最新版が入る。sudo無しでgem installすると、Gemは~/.gem/rubyに入る。
- Jekyllをgem installするには、native extensionsのビルドのためにruby-devel、make、gcc、rpm-build、gcc-c++が必要。
- Jekyllは最新版が入る。
Rubyのインストール:
sudo dnf install ruby
Bundlerのインストール:
gem install bundler
Jekyllのインストール:
sudo dnf install ruby-devel make gcc rpm-build gcc-c++
gem install jekyll
入るコマンドのバージョンとインストール先:
コマンド | バージョン | インストール先 |
---|---|---|
ruby | 2.5.5p157 (古い) | /usr/bin/ruby |
gem | 2.7.6.2 (古い) | /usr/bin/gem |
bundle | 2.1.4 (最新) | ~/bin/bundle |
jekyll | 4.0.0 (最新) | ~/bin/jekyll |
Gemのインストール先:
- ~/.gem/ruby
snapでRubyを入れ、gemでJekyllを入れる場合
- snapdを入れるには、Extra Packages for Enterprise Linux (EPEL)リポジトリの追加が必要。dnf installでsnapdを入れたら、snapの通信ソケットを有効にして、classic snap用にシンボリックリンクを作成し、PATH反映のためにログインし直す。これでsnapコマンドが使えるようになる。
- snap install rubyには–classicをつける必要あり。初回はなぜか「error: too early for operation, device not yet seeded or device model not acknowledged」と言われて止まるが、2回目はうまくいった。snapで最新版のRubyを入れるとなぜかgemやbundleがエラーになるので(詳細は後述)、やむなくひとつ前のバージョン2.6/stableにした。
- Jekyllをgem installするには、native extensionsのビルドのためにmake、gcc、gcc-c++が必要。
- Jekyllは最新版が入る。
snapdのインストールと設定:
sudo dnf install epel-release
sudo dnf install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
# ここでPATH反映のため再ログイン
Rubyのインストール:
sudo snap install ruby --classic --channel=2.6/stable # 初回はエラーになるが2回目は成功
Jekyllのインストール:
sudo dnf install make gcc gcc-c++
gem install jekyll
入るコマンドのバージョンとインストール先:
コマンド | バージョン | インストール先 |
---|---|---|
ruby | 2.6.6p146 (1つ前) | /var/lib/snapd/snap/bin/ruby |
gem | 3.0.3 (1つ前) | /var/lib/snapd/snap/bin/gem |
bundle | 2.1.4 (最新) | /var/lib/snapd/snap/bin/bundle |
jekyll | 4.0.0 (最新) | ~/.gem/bin/jekyll |
Gemのインストール先:
- ~/.gem
rbenvでRubyを入れ、gemでJekyllを入れる場合
- gitを入れ、rbenvをgit cloneで入れ、PATHと環境設定コマンドを.bash_profileに追加してsourceする。
- Rubyのインストール用に、ruby-buildをgit cloneで入れる。
- Rubyのインストールにはgcc、make、openssl-develが必要。
- rbenv installでRubyのバージョンを指定してインストールする。ここでは現時点で最新の2.7.1を指定。
- インストールできたら、使用するRubyバージョンをrbenv localで指定すると、設定が./.ruby-versionに保存される。
- Jekyllをgem installするには、native extensionsのビルドのためにmake、gcc、gcc-c++が必要。
- インストールするGemは~/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0に入るので、gem installにsudoは不要。
rbenvのインストールと設定:
sudo dnf install git
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
~/.rbenv/bin/rbenv init # 指示が表示される
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
. ~/.bash_profile
ruby-buildプラグインのインストール:
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
Rubyのインストール:
sudo dnf install gcc make openssl-devel
rbenv install 2.7.1
Rubyの使用バージョン指定:
rbenv local 2.7.1
Jekyllのインストール:
sudo dnf install gcc-c++
gem install jekyll
入るコマンドとインストール先:
コマンド | インストール先 |
---|---|
ruby | ~/.rbenv/shims/ruby |
gem | ~/.rbenv/shims/gem |
bundle | ~/.rbenv/shims/bundle |
jekyll | ~/.rbenv/shims/jekyll |
上記は、現在使用中のバージョンのコマンドに飛ばすためのラッパー。コマンドの実体は下記。
コマンド | バージョン | インストール先 |
---|---|---|
ruby | 2.7.1p83 (最新) | ~/.rbenv/versions/2.7.1/bin/ruby |
gem | 3.1.2 (最新) | ~/.rbenv/versions/2.7.1/bin/gem |
bundle | 2.1.4 (最新) | ~/.rbenv/versions/2.7.1/bin/bundle |
jekyll | 4.0.0 (最新) | ~/.rbenv/versions/2.7.1/bin/jekyll |
Gemのインストール先:
- ~/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0
補足: snapで最新版のRubyを入れるとなぜかgemやbundleがエラーになる
これを書いている時点では、snapで最新版(–channel=stable、Ruby 2.7.1)のRubyをインストールすると、rubyコマンドは実行できるのに、そのほかの付属コマンドであるbundle、gem、irb、rake、rdoc、riなどを実行すると下記のようなエラーが出る。–channel=2.6/stable (Ruby 2.6.6)ではこの事象は出ない。ちなみにCentOS 7でも同様。
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
$ gem -v
/snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:12: warning: already initialized constant Gem::VERSION
/var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:12: warning: previous definition of VERSION was here
/snap/ruby/181/lib/ruby/2.7.0/rubygems/compatibility.rb:15: warning: already initialized constant Gem::RubyGemsVersion
/var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/compatibility.rb:15: warning: previous definition of RubyGemsVersion was here
[...]
Traceback (most recent call last):
5: from /var/lib/snapd/snap/ruby/181/bin/gem:8:in `<main>'
4: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
3: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
2: from /snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:1397:in `<top (required)>'
1: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- rubygems/defaults/operating_system (LoadError)
14: from /var/lib/snapd/snap/ruby/181/bin/gem:8:in `<main>'
13: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
12: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
11: from /snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:1397:in `<top (required)>'
10: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:156:in `require'
9: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:161:in `rescue in require'
8: from /snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:204:in `try_activate'
7: from /snap/ruby/181/lib/ruby/2.7.0/rubygems/specification.rb:996:in `find_by_path'
6: from /snap/ruby/181/lib/ruby/2.7.0/rubygems/specification.rb:815:in `stubs'
5: from /snap/ruby/181/lib/ruby/2.7.0/rubygems/specification.rb:932:in `dirs'
4: from /snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:420:in `path'
3: from /snap/ruby/181/lib/ruby/2.7.0/rubygems.rb:374:in `paths'
2: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
1: from /var/lib/snapd/snap/ruby/181/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require'
/snap/ruby/181/lib/ruby/2.7.0/rubygems/path_support.rb:7:in `<top (required)>': uninitialized constant Gem::PathSupport (NameError)
※バージョンメモ
- VirtualBox 6.1.6
- Vagrant 2.2.7
- CentOS 8.1.1911 (vagrant box centos/8 (virtualbox, 1905.1))