Subscribed unsubscribe Subscribe Subscribe

CabalizeされたHaskellプロジェクトでバージョン番号のbump upを忘れないためには

Haskell

cabalファイルのversionは上げたけど、コマンドラインから--helpしたときに出力されるバージョン番号のアップデートを忘れていた!というのはよくある話です。

僕も先日まで知らなかったのですが、cabalizeされたHaskellプロジェクトなら、cabalファイルで指定したversionをAPI経由で取り出すことができます。つまりバージョン番号の管理をcabalファイルで一元管理することができます。

TKYProfで実際に使っているので紹介します。

CabalにはPaths_という名前のモジュールを生成する機能(参考)があります。TKYProfならpkgnameはtkyprofなので、Paths_tkyprofです。これを使えばプログラマブルにバージョン番号を取り出せます。

Paths_は次のようなAPIになっています。

  • version :: Version
  • getBinDir, getLibDir, getDataDir, getLibExecDir :: IO FilePath
  • getDataFileName :: FilePath -> IO FilePath

型をみれば使い方は想像に難くないでしょう。tkyprof/bin/tkyprof.hsから引用します。

import Data.Version (showVersion)
-- 略
import Paths_tkyprof (getDataDir, version)
-- 略

main :: IO ()
main = do
  getDataDir >>= setCurrentDirectory
  TKYProfArg p <- cmdArgs tkyProfArg
  hPutStrLn stderr $ "TKYProf " ++ showVersion version ++ " launched, listening on http://localhost:" ++ show p ++ "/"
  withTKYProf $ run p

Cabalファイル側にもこのモジュールを使っている旨を明記しましょう。

other-modules:      TKYProf
                    -- 略
                    Paths_tkyprof
                    -- 略

これだけです。

ただし、このモジュールを使うとGHCi経由でPath_が見えないと怒られるようになるかもしれません。その場合はcabal-dev ghciコマンドを使うといいでしょう。今年のGSoCでcabal replというコマンドを作っている人がいるようなので、今後はそちらがメインになるかもしれません。