このサイトは Haskell の静的サイトジェネレーター Hakyll を使っており,古いパッケージ(Hakyll とは関係ない)を使ってた関係で,かなり古い LTS を使ってた(lts-6.20). サイトを作ってから約1年経ち,Haskell力(というか stack 力)も上がり,別に古い LTS を使わずとも stack.yaml をいじればなんとかなるというのが分かり,ずっと最新のに上げたいなぁと思っていた.

で,今回はいっそのこと最近リリースされた GHC8.2 用の resolver で,なんとかビルドしてみようかなと思ったわけです.

無駄に順を追って書いてあるけど,最後の数行を読むだけで十分(笑).

GHC8.2 系の Stackage resolver

3週間ほど前に GHC8.2.1 が遂にリリースされ,それに伴い,10日ほど前に StackageGHC8.2 対応の resolver がリリースされた. まだリリースされたばかりで,Hakyll を含め,いろんなパッケージが除外されている.

なので,この resolver で Hakyll のサイトをビルドするには三手間ぐらい必要だった.

stack.yaml をいじる

基本的には stack.yaml をいじるだけで良い(??).

extra-deps を書き換えていく

試しに stack.yaml の resolver を nightly-2017-08-10 にして stack build してみると次のように出る.

hakyllyaml-light が無いと言われる. ので,素直にエラーメッセージ通り,stack.yamlextra-deps に2つのパッケージを書き加えてやる.

また書き加える.

うーん,これはよくわからない. てっきり,Cabal を 2.0 以上にすればよいのかと思い,それに対応した stack-1.5.1 にあげればうまくいくのだと思ったのだが,うまくいかなかった. なので,問題が起きない haddock-library-1.4.3 を使うことにした.

ちなみに,nightly-2017-08-10 を使うだけで以下のような同様のエラーが出たが,これは stack-1.5.1 にするだけでうまくいった(haskell-jp で igrep さんに教えてもらった!感謝!!).

閑話休題

適当に古いパッケージを選択してあげる.

- time-1.6.0.1
- skylighting-0.1.1.5
- process-1.4.3.0
- hslua-0.4.1

Pandoc 2.0 を使う

今までのようなエラーは出なくなったが普通にコンパイルエラーが起きる.

pandoc-1.19.2.1: configure
Progress: 1/4
--  While building package pandoc-1.19.2.1 using:
    Process exited with code: ExitFailure 1
    Logs have been written to: C:\Users\hoge\matsubara0507.github.io\.stack-work\logs\pandoc-1.19.2.1.log

    [1 of 2] Compiling Main

    C:\Users\hoge\AppData\Local\Temp\stack2412\pandoc-1.19.2.1\Setup.hs:42:3: error:
        • Couldn't match expected type ‘ComponentLocalBuildInfo
                                        -> PreProcessor’
                      with actual type ‘PreProcessor’
        • In the expression:
            PreProcessor
              {platformIndependent = True,
               runPreProcessor = mkSimplePreProcessor
                                   $ \ infile outfile verbosity
                                       -> do let ...
                                             ....}
          In the expression:
            \ _ lbi
              -> PreProcessor
                   {platformIndependent = True,
                    runPreProcessor = mkSimplePreProcessor
                                        $ \ infile outfile verbosity -> ...}
          In the expression:
            ("hsb",
             \ _ lbi
               -> PreProcessor
                    {platformIndependent = True,
                     runPreProcessor = mkSimplePreProcessor
                                         $ \ infile outfile verbosity -> ...})
       |
    42 |   PreProcessor {
       |   ^^^^^^^^^^^^^^...

    C:\Users\hoge\AppData\Local\Temp\stack2412\pandoc-1.19.2.1\Setup.hs:45:39: error:
        Data constructor not in scope: FlagName :: [Char] -> FlagName
       |
    45 |       do let embedData = case lookup (FlagName "embed_data_files")
       |                                       ^^^^^^^^

これは Cabal-2.0 で変わった仕様によるエラーだ. 最新の pandoc-2.0なら直っているので,個別にクローンする設定にする.

stack.yaml をこう書き換えてビルドする.

pandoc-2.0 では skylighting の PVP を変えたようだので extra-deps から外し,代わりに cmark-gfm-0.1.3 を書き加える.

Fork して書き換える

hakyll がそもそも pandoc-2.0 に対応していないようだ. 割とここからが大変. というのも pandoc-2.0 はまぁまぁ仕様が変わっているので,PVP をいじるだけではうまくビルドできない. 幸いにも,pandoc-2.0 に対応させた fork があったので,これを参考に書き直した. ついでに,time パッケージと process パッケージの PVP も書き直す.

それらの書き換えを自分の fork で行いプッシュして,それをクローンするように stack.yaml を書き加えた.

これでビルドすると pandoc-citeproc が怒られる.

これも Cabal-2.0 の影響だ. なので,pandoc-citeproc パッケージも fork して直してプッシュしてそれをクローンする.

最終的に

多少整理して最終的に stack.yaml はこんな風になった.

おしまい

これで GHC8.2 の LTS が出てもすぐに対応できるね!(たぶん)