Cabal パッケージに外部ファイルを埋め込む

Cabal パッケージで実行時に必要な外部ファイル埋め込む方法について

Cabal パッケージの設定

pkgname.cabal で data-files もしくは data-dir を指定する。data-files はワイルドカード指定できるので data-files: images/*.png などまとめてファイル指定も可能。

実装方法

data-files のフルパスを取得する関数が用意されている

getDataFileName :: FilePath -> IO FilePath

利用するときは import Paths_pkgname する必要がある

import Paths_pkgname
import qualified Data.ByteString.Lazy.Char8 as BS

getContent = do
  fp <- getDataFileName "data/hoge.txt"
  content <- BS.readFile fp
  return content

参考) Accessing data files from package code