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_SORTABLE
をfalse
にしてやれば回避できるとのこと。ただし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の更新を終えられた。