【2022年版】 Windows10/11 への Jekyll (4.2.2) インストールにおけるトラブルシューティング


Windows11 にて、2022年4月5日現在の最新版である Jekyll 4.2.2 をインストールし、ローカルで
Jekyll の [Edition](https://cloudcannon.com/community/themes/edition/) テーマを用いたサイトをビルドしようとしたところ、エラーが出てビルドできませんでした。

Google で検索しながら、トラブルシューティングを行いましたが、最終的に修正できるまで時間がかかったため、この記事で対処方法をまとめておきます。

この記事でエラーの詳細を記述しているのは、同じエラーに遭遇しているにもかかわらず、問題の解決方法が分からずに、
[teratail](https://teratail.com/) で質問しても正解が得られなかったり、暫定的な処置をしていたりするので、エラーメッセージで検索して、この記事に辿りつくようにするためです。

また、同じ Ruby 製の静的サイトジェネレーターである [Middleman](https://middlemanapp.com/jp/) でも同じエラーが出ているようなので、この記事の対処方法が役に立つと思います。



### Jekyll 用 Edition テーマとは

[Edition](https://cloudcannon.com/community/themes/edition/) テーマは、[CloudCannon](http://cloudcannon.com/) 社が作成した [Jekyll](https://jekyllrb.com/) 用のテンプレートで、製品やサービスのドキュメントに使われることを想定しています。

GitHub の [CloudCannon/edition-jekyll-template](https://github.com/CloudCannon/edition-jekyll-template) で公開されていますが、このテーマをテンプレートリポジトリとしてリポジトリを作成することができます。

今回、 GitHub で、このリポジトリをテンプレートリポジトリとして自分のリモートリポジトリを作成した上で、このリモートリポジトリをローカルにクローンし、このリポジトリを Jekyll でビルドします。

### 動作環境

今回の記事では、Jekyll に必要な Ruby と Bundler のインストール方法の詳細は、割愛します。別途、記事にする予定です。

- Windows 11
- [Jekyll](https://jekyllrb.com/), v4.2.2 - Ruby 製の静的サイトジェネレーター
- [Ruby](https://www.ruby-lang.org/ja/), v3.1.1p18
- [Bundler](https://bundler.io/), v2.3.10

### ローカルでビルドし、表示を確認する方法

上述の [CloudCannon/edition-jekyll-template](https://github.com/CloudCannon/edition-jekyll-template) をテンプレートリポジトリとして作成したリポジトリの下に移動し、[Bundler](http://bundler.io/) で依存関係をインストールします。

```bash
$ bundle install
```

Gemfile に gem を追加した場合は、上記のコマンドを実行して、追加した gem をインストールします。

インストールが正常に終了したら、以下のコマンド実行により、Bundler を通して `jekyll` コマンドを実行することにより、(時間がかかりますが) 正しいバージョンを使用してサーバーを起動することができます。

```bash
$ bundle exec jekyll serve --trace
```

> :memo: **注意 (Note):** `--trace` フラグを付けて `jekyll serve` を実行しているのは、Jekyll 4.2.2 のコマンド実行において、`--trace` フラグを付けて実行するように、というメッセージが表示されるためです。

ブラウザで `http://localhost:4000/` を開くと、ビルドされたサイトが表示されます。



### 上記のビルドで発生するエラーとその対策

上記のビルドとサーバー起動で遭遇するエラーとその対処方法を説明していきます。


#### 1. Jekyll の互換性エラー

**エラーメッセージ**

```shell
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/bundler-1.16.4/lib/bundler/shared_helpers.rb:29: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
```

上記のエラーメッセージが大量に出たり、下記のエラーメッセージが表示されます。

```shell
bstractMemory.c: In function 'memory_get_array_of_string':
AbstractMemory.c:456:13: warning: 'rbimpl_tainted_str_new_cstr' is deprecated:
taintedness turned out to be a wrong idea. [-Wdeprecated-declarations]
456 |             rb_ary_push(retVal, (strptr == NULL ? Qnil :
rb_tainted_str_new2(strptr)));
      |             ^~~~~~~~~~~
In file included from G:/Ruby31-x64/include/ruby-3.1.0/ruby/intern.h:57,
                 from G:/Ruby31-x64/include/ruby-3.1.0/ruby/ruby.h:192,
                 from G:/Ruby31-x64/include/ruby-3.1.0/ruby.h:38,
                 from AbstractMemory.c:43:
```

**エラーの原因**

上記のエラーメッセージで `deprecated` と表示されているように、現在、
利用している Ruby 3.1.1 で非推奨となっている関数が使用されているためにエラーが発生しています。

これは、このリポジトリの Gemfile の指定の Jekyll のバージョンが古いために発生しています。
ですので、以下のように Jekyll のバージョン指定を削除して、最新の gem を使うようにします。

修正した後は、`bundle update` で gem を更新します。

**修正前の Gemfile**

```ruby
source 'https://rubygems.org'

gem 'jekyll', '3.8.4'

group :jekyll_plugins do
  gem 'jekyll-feed', '0.11.0'
  gem 'jekyll-seo-tag', '2.5.0'
  gem 'jekyll-sitemap', '1.2.0'
end
```

**修正後の Gemfile**

```ruby
source 'https://rubygems.org'

gem 'jekyll'

group :jekyll_plugins do
  gem 'jekyll-feed'
  gem 'jekyll-seo-tag'
  gem 'jekyll-sitemap'
end
```


#### 2. tzinfo のエラー

**エラーメッセージ**

`bundle install` 実行で、以下のエラーが発生します。

```shell
Configuration file: G:/Jekyll/axios-docs-ja/_config.yml
  Dependency Error: Yikes! It looks like you don't have tzinfo or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. If you've run Jekyll with `bundle exec`, ensure that you have included the tzinfo gem in your Gemfile as well. The full error message from Ruby is: 'cannot load such file -- tzinfo' If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!
```

**エラーの原因**

Windows に Jekyll をインストールする場合、[資料1](#資料1) に書かれているように、タイムゾーン用の '[tzinfo](https://rubygems.org/gems/tzinfo)' gem の追加が必要です。

**Gemfile 修正方法**

[資料1](#資料1) に書かれている通り、上記の「修正後の Gemfile」の `end` の上に、以下の行を挿入します。

```ruby
  gem 'tzinfo', '~> 1.2'
```


#### 3. tzinfo-data のエラー

**エラーメッセージ**

`bundle exec jekyll serve --trace` の実行で、以下のエラーメッセージが表示されます。

```shell
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/tzinfo-1.2.9/lib/tzinfo/data_source.rb:182:in `rescue in create_default_data_source': No source of timezone data could be found. (TZInfo::DataSourceNotFound)
```

**エラーの原因**

'[tzinfo](https://rubygems.org/gems/tzinfo)' gem に必要な '[tzinfo-data](https://rubygems.org/gems/tzinfo-data)' gem がインストールされていないため、エラーが発生しています。
[資料4](#資料4) に書かれているように、Gemfile の指定に  `gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]` を追加します。


#### 4. tzinfo-data のエラー2

**エラーメッセージ**

`bundle install` で、以下のエラーメッセージが表示されます。

```shell
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32`.
```

**エラーの原因**

[資料5](#資料5) の記事によると、解決方法は 4つあるそうで、1番目の解決方法である `, platforms: [:mingw, :mswin, :x64_mingw]` を削除する方法を採用します。


#### 5. wdm のエラー

**エラーメッセージ**

`bundle exec jekyll serve --trace` の実行で、以下のエラーメッセージが表示されます。

```shell
  Please add the following to your Gemfile to avoid polling for changes:
    gem 'wdm', '>= 0.1.0' if Gem.win_platform?
 Auto-regeneration: enabled for 'G:/Jekyll/axios-docs-ja'
G:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/jekyll-4.2.2/lib/jekyll/commands/serve/servlet.rb:3:in `require': cannot load such file -- webrick (LoadError)
        from G:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/jekyll-4.2.2/lib/jekyll/commands/serve/servlet.rb:3:in `<top (required)>
```

**エラーの原因**

'[wdm](https://rubygems.org/gems/wdm)' gem は、Windows Directory Monitor (WDM) の略で、Windows においてファイル更新を監視するためのライブラリです。

[資料1](#資料1) には、Jekyll サーバーでファイル変更の監視を行うために、以下の行を追加するように書かれています。

```ruby
gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform?
```

しかし、上記のエラーメッセージに書かれているように、`gem 'wdm', '>= 0.1.0' if Gem.win_platform?` を追加することにします。

なお、[資料6](#資料6) には、代わりに下記の行を追加するようにしていますが、現状ではメッセージの通りの指定を採用しています。

```ruby
gem 'wdm', '>= 0.1.0', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```


#### 6. webrick のエラー

**エラーメッセージ**

`bundle exec jekyll server` で Web サーバを起動しようとすると、以下のエラーメッセージが表示される。

```shell
G:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/jekyll-4.2.2/lib/jekyll/commands/serve/servlet.rb:3:in `require': cannot load such file -- webrick (LoadError)
```

**エラーの原因**

[資料7](#資料7) の記事によると、'[webrick](https://rubygems.org/gems/webrick)' も Gemfile に追加する必要があるそうです。

また、[資料7](#資料7) では、下記のエラーメッセージが表示されるそうです。

```shell
bundler: failed to load command: jekyll, `require': cannot load such file -- webrick (LoadError)
```

後から気付いたことですが、[Jekyll 日本語訳](http://jekyllrb-ja.github.io/) から [Jekyll 本家サイト](https://jekyllrb.com/) が更新されており、
[資料3](#資料3) に 'webrick' に関する記述が追加されていました。

[資料3](#資料3) のコマンド実行ではなく、Gemfile に `gem 'webrick'` の行を追加します。



### 結論

#### 追加が必要な gem

| gem       | 現在の最新版 |
|:----------|:-------------|
| [tzinfo](https://rubygems.org/gems/tzinfo) | 2.0.4 |
| [tzinfo-data](https://rubygems.org/gems/tzinfo-data) | 1.2022.1 |
| [wdm](https://rubygems.org/gems/wdm) | 0.1.1 |
| [webrick](https://rubygems.org/gems/webrick) | 1.7.0 |

#### 備考

日本語訳の [資料1](#資料1) から本家サイトの [資料2](#資料2) では、以下の行を Gemfile に追加するように書かれています。

```ruby
platforms :mingw, :x64_mingw, :mswin, :jruby do
  gem "tzinfo", ">= 1", "< 3"
  gem "tzinfo-data"
end
```

しかし、[資料5](#資料5) の解決方法1、「プラットフォーム関係なく tzinfo-data のタイムゾーンを参照する設定」を採用したため、
プラットフォーム指定は行わず、バージョン指定のみ採用することにしました。

'tzinfo' の指定を修正した後に、`bundle update` を実行しておきます。


#### 最終的な Edition テーマの Gemfile

```ruby
source 'https://rubygems.org'

gem 'jekyll'

group :jekyll_plugins do
  gem 'jekyll-feed'
  gem 'jekyll-seo-tag'
  gem 'jekyll-sitemap'
  gem 'tzinfo', ">= 1", "< 3"
  gem 'tzinfo-data'
  gem 'wdm', '>= 0.1.0' if Gem.win_platform?
  gem 'webrick'
end
```


#### 参考記事

##### 資料1

[Jekyll 日本語訳](http://jekyllrb-ja.github.io/) の [Jekyll on Windows](http://jekyllrb-ja.github.io/docs/installation/windows/)

##### 資料2

[Jekyll 本家サイト](https://jekyllrb.com/) の [Jekyll on Windows](https://jekyllrb.com/docs/installation/windows/) は、上記の日本語訳から更新されており、修正方法が下記になっています。

```ruby
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
platforms :mingw, :x64_mingw, :mswin, :jruby do
  gem "tzinfo", ">= 1", "< 3"
  gem "tzinfo-data"
end
```

##### 資料3

[Jekyll 本家サイト](https://jekyllrb.com/) の [Quickstart](https://jekyllrb.com/docs/) には、日本語訳にはない、下記の記述が追加されています。

> :warning: **<font color="hotpink">警告 (Warning): </font>**  Ruby バージョン 3.0.0 以降を使用している場合、手順5 が失敗することがあります。 この場合、`bundle add webrick` コマンドを実行し、依存関係に webrick を追加することで解決できます。

##### 資料4

[【Rails】TZInfo::DataSourceNotFoundエラーが発生する](http://michele13.blog.fc2.com/blog-entry-10.html)

##### 資料5

[bundle installする際のtzinfo-dataのwarningがウザい](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)

##### 資料6

[Ruby on Rails チュートリアル Windows での実施時の困ったメモ](https://qiita.com/yasumichi/items/ccf1f7f57b6627034226)

##### 資料7

[Jekyllを実行した時に bundler: failed to load command: jekyll, `require': cannot load such file -- webrick (LoadError) が出るときの対処法](https://tex2e.github.io/blog/ruby/jekyll-cannot-load-webrick)