Nanoc3系からNanoc4へのアップグレード
いくつかNanocで管理しているサイトがあるのでそのアップグレード作業を行った。
Nanoc3のままでもそれほど困りはしないのだが、ファイル数が1500を超えてコンパイルがだいぶ重くなっていたので、それが速くならないかなどの期待をこめて・・・
作業自体は公式のアップグレードガイドを参照すればさほど難しくなかった。
と言いつつQuick upgrade guideの手順を飛ばしてしまいハマったりしたのでひとつひとつ確実に。
まずはGitのブランチを切る
いざとなったら簡単に元に戻すためブランチは切っておこう。
作業中も何かおかしくなったらうまく行ってたところまで戻せるようにこまめにコミットを。
とりあえずup-to-nanoc4というブランチを切った。
Quick upgrade guideに沿って修正作業
基本的にQuick upgrade guideの項をひとつひとつチェックして適用していけばOK。
当てはまらない項目では何もしなくて良く、自分の場合は以下の四項目だけ対応すればよかった。
- lib以下のヘルパー等の定義や呼び出しで「Nanoc3」と書いてある部分を「Nanoc」に修正
- layouts以下のテンプレートファイル内の「@site.config」を「@config」に修正
- config.yaml(またはnanoc.yaml)のデータソース定義に「identifier_type: legacy」の行を追加
- config.yamlに「string_pattern_type: legacy」の行を追加。
ちなみに当初「string_pattern_type: legacy」の項をスキップしてしまいコンパイルエラー。
どこでエラーが出ているか分からないエラーメッセージで数時間ロスした。
@items.atが使えないぞ
Quick upgrade guideの通りでだいたいOKだったが、自作のテンプレート内でコンパイルエラーが出た。
@items.at(identifier) と書いていた箇所で以下のようなエラーが出る。
NoMethodError: undefined method `at' for <Nanoc::ItemCollectionWithRepsView>:Nanoc::ItemCollectionWithRepsView
これは @items[identifier] で取れるようになっていたので、そのように修正。
テンプレートやヘルパー内で色々とやっているとこれ以外にも問題が出るかもしれない。エラーメッセージをよく読んで対応していくしかない。
ともかくこれで既存のサイトをNanoc4でコンパイルできるようになった。
Extended upgrade guideはスルー
identifierを新しいfullの形式に対応させる方法が書かれている。
ここまで踏み込むとcontent内のファイルの位置を移動したりしなければならず、けっこう大変な作業になるのでひとまずやめておいた。
legacyとfullの違いを言うとoutputが以下の場合
output/hoge/index.html
output/hoge/hige/index.html
legacyではcontent内が次のファイル構成だったが
content/hoge/index.md
content/hoge/hige.md
fullでは次のように変更しなくてはならない。
content/hoge.md
content/hoge/hige.md
なおlegacyのファイル構成でfullにしてしまうとoutputが以下のようになってしまい、サイトのURL構造が変化してしまう。
output/hoge/index/index.html
output/hoge/hige/index.html
この変更をした上でRuleファイルも新しい形式に対応させる必要がある。
とりあえずはスルーだが、地道にやればそんなに大変な作業ではなさそうなので後でやるかもしれない。
Guard::Nanocのバージョンアップ
Guard::Nanocが動かなくなったので、これのバージョンを1.0.1から2.0.0に上げた。
今まで通り無事にGuard::Nanocが使えるようになった。
アップグレード完了
up-to-nanoc4をmasterにマージして終了。
でもコンパイルは速くならなかった。残念。いや、Rubyを最新バージョンにしたこともあり倍以上は速くなったけどそれでも10秒くらいは待たされるって言う。
自作のヘルパーやフィルターが重いのが原因ということは分かっているので対策のしようはあると思うが、それはまた別途か。
Nanocに限らずファイル数が増えてくると重くなるのが静的サイトジェネレータの課題かなあ。
プレビューするのに待たされるのが不便。
静的サイトを作るにも最近はWordPress+StaticPress+S3がいいのかもって思ってる。
編集画面でMarkdown使えるプラグインもあるしね。
と言いつつ使い慣れたエディタで編集できると言うことでNanocみたいな静的サイトジェネレータも捨てがたいが。