• 作成:

Hakyllで配布するファイルとシステムファイルのディレクトリを分ける

現在のこのリポジトリ、 ncaq/www.ncaq.net at 455bf52284b0ceb0f1235478efc582337fc848e9 には多大な設計ミスがあり、それが様々な微妙な問題を引き起こしています。

これまでこれを解決するのは極めて面倒くさく、一応動いているこのリポジトリを修正するのは割に合わないと思っていましたが、考え直すと割とそこまで困難ではないなと思い返したので、細かく修正していきます。

これらの修正は殆ど出力するHTMLを変更しないため、壊れていないことを確認するのは割と容易なはずです。

ページがプロジェクトルートにそのまま書かれている

例えばabout.mdとかがプロジェクトルートにそのまま書かれています。

最初は問題なかったのですが、配布するファイルが増えていくにつれて、配布するものとビルドに必要なファイルが混ざって、分かりにくくなってしまいました。

解決方法

siteディレクトリみたいな新しいディレクトリを作り、配布ファイルはそこに置きます。 providerDirectory を設定して、デフォルト値の.からsiteに変更してやれば、すぐに実装完了と考えました。

templateで少し躓きました

概ね想定通りに動いたのですが、最初に、

[ERROR] Hakyll.Core.Compiler.Require.load: templates/entry.html (snapshot _final) was not found in the cache, the cache might be corrupted or the item you are referring to might not exist

と言われてサイトのビルドが通りませんでした。

キャッシュの不整合が原因かなと思ってGHCを推奨最新版まで上げてみたり、 (それまでHLSに問題があったので少し古いバージョンで留めていました) LTSを上げてみましたが解決せず。リポジトリを眺めてみたりしましたがあまり参考になりませんでした。

原因は、

  match "templates/*" $ compile templateCompiler

templates以下のファイルを処理しているのにも関わらず、 templatessite以下に置いていなかったからでした。

siteは配布するものを置くという固定観念からきた見逃しですね。

.gitignoreに注意

生成ツールを使っていると、 mkdocs用に以下のように無視されていたりするので注意。

# mkdocs documentation
/site