Bundlerを使ってJekyllをインストールする

Bundlerを使ってローカルなDIRにJekyllをインストールしてサイトを立ち上げる。 システムにaptとかgemで入れたjekyllとはちょっと違っていたのでメモ。

詳しくは英文だが公式サイトのここに書いてある。

Using Jekyll with Bundler | Jekyll • Simple, blog-aware, static sites

まずは、jekyllサイト用のDIR(ここではMyJekyllSite)を作り、rbenvで特定Rubyバージョンのローカルな環境を作る。

$ mkdir MyJekyllSite
$ cd MyJekyllSite/
$ rbenv local 2.5.3
$ rbenv version
2.5.3 (set by /home/jgb/MyJekyllSite/.ruby-version)

bundlerの初期化コマンドを、この~/MyJekyllSiteローカルで実行して、直下にGemfileを書き出す。

$ rbenv exec bundle init
Writing new Gemfile to ~/MyJekyllSite/Gemfile
$ ls -a
./  ../  .ruby-version  Gemfile

Gemfileにまだgemが何も書かれていない状態(コメントアウトされた"rails"が書いてあるだけ)で、bundle install --path vendor/bundleを実行する。

$ bundle install --path vendor/bundle
The Gemfile specifies no dependencies
Resolving dependencies...
Bundle complete! 0 Gemfile dependencies, 1 gem now installed.
Bundled gems are installed into `./vendor/bundle`
jgb@Bosch3:~/MyJekyllSite$ ls -a
./  ../  .bundle/  .ruby-version  Gemfile  Gemfile.lock  vendor/

次のコマンドでGemfilejekyllを書き足す。

$ bundle add jekyll

Gemfileは次のようになっていてjekyllが追加書きされているだけなのだが、そのわりに上記コマンドはいろいろしているっぽい。 実際このコマンドが正常に終われば、すでにjekyllや関連する依存関係の gem はこのローカルDIRにインストールされている。

$ less Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

gem "jekyll", "~> 3.8"

そして次のコマンドでScaffoldが書き出される。普通のjekyll new "sitename"と違ってすでにあるGemfileなどを消さないように書き出す必要があるので、--force --skip-bundleオプションが必須。

$ bundle exec jekyll new --force --skip-bundle .
New jekyll site installed in ~/MyJekyllSite. 
Bundle install skipped. 
$ bundle install

あとはjekyll serveの前にbundle execを付けてサーバを立ち上げれば、いつものhttp://127.0.0.1:4000で初期サイトが見える。

$ bundle exec jekyll serve

Gemfileに直接gem 'jekyll', '3.8.5'などと手書きして、bundle install --path ./vendor/bundlerを実行しても問題ないようで、vendor/bundlerDIRの中にjekyll本体と依存gemがインストールされる。ただ公式ドキュメントにある上記のような方法だと、生成された_config.ymlに以下のようなGemfile関連をサイト構築対象から除外する設定が自動で書き込まれていて便利(ただしデフォルトのままではコメントアウトされているので外すこと)。

exclude:
  - Gemfile
  - Gemfile.lock
  - node_modules
  - vendor/bundle/
  - vendor/cache/
  - vendor/gems/
  - vendor/ruby/