Middlemanを更新したらcurrent_pathがどうとかっていうエラーが起きました

ふと思い立ってmiddlemanを更新してみたところ、思いのほか大変だった。

まずはRuby 2.4.0に対応していないこと。正確には依存関係で引っぱられてくるgemの一つがビルドできないため。めんどうそうなのでRuby 2.3.3で動かすことにする。

例によってnokogiriのインストールができないなどを経由しつつ、gemを更新できたところでmiddleman buildを実行したところ、ちょっと謎なエラーが発生した。

== Building files
== Request: /index.html
       error  build/index.html
comparison of String with :current_path failed
/.../lib/ruby/gems/2.3.0/gems/tilt-2.0.5/lib/tilt/template.rb:163:in `sort!'

問題の場所にbyebugを入れてbtを順にたどって確認していくと、どうもmiddleman自身は:current_pathでよいと考えているっぽい。(btのコードに:current_pathが出てくる。) となると例外を上げているtiltとの整合性の問題なのかな?

tilt.gemのバージョンは2.0.5。これを2.0.4にしてみたがエラー。2.0.0にするとエラーなし。2.0.3、2.0.2でもダメ。2.0.1はOK。

と、ここまで進める中で、うすうす気付いていたのだけど、やっぱりすでに報告されていた: #2002 Current Path

このissueのコメントによればTilt::SYMBOL_ARRAY_SORTABLEfalseにしてやれば回避できるとのこと。ただしtilt側ではSYMBOL_ARRAY_SORTABLEすでに削除している。ちなみにSYMBOL_ARRAY_SORTABLEが入ったのはここ

次のtiltのリリースではなくなっていそうなSYMBOL_ARRAY_SORTABLEをいじるのもどうかと思い、当面はtilt.gemの2.0.2〜2.0.5を回避することとする。Gemfileに以下を追加した:

gem 'tilt', '!= 2.0.2', '!= 2.0.3', '!= 2.0.4', '!= 2.0.5'

さて、これでエラーが起きなくなったわけだが、念のために以前の環境で生成されたHTML群との差分をとっておく。

すると、記事中のリンクに問題があることが分かった。blog記事中で[リンク](YYYY-mm-dd-title.html)のように書いたとき、HTML上では<a href="YYYY/mm/dd/title/">リンク</a>となっていたものが<a href="YYYY-mm-dd-title.html">リンク</a>となってしまっていた。

いろいろ調べたのだがよくわからず、仕方なくmiddleman init --template=blogして小さなblogサイトを作ってみたところ、これが問題なく展開されてしまう。config.rbを比較しても目立った違いはない。

あとは、gemか。

bundle showの比較をすると、いくつかの違いがあるが、これも目立ったものはない。少々気になるのはtilt.gemだが…… と、おそるおそるtilt.gemを2.0.5にすると、きちんと展開される。ぐぐぐ。

先ほど追加したgemを削除して元に戻し、config.rbの先頭に以下を追加した。

Tilt::SYMBOL_ARRAY_SORTABLE = false

実行時にwarningが表示されてしまうが、当面は気にしないことにする。ともあれ、これでmiddlemanの更新を終えられた。