Saw*_*yer 25 static haskell constants precompiled
假设我有一个dictionary.txt
文件,我需要将其读入地图并在我的程序中使用它,如何将这个dictionary.txt文件包含在已编译的exe文件中?
cli*_*ntm 21
您必须以自己的方式将其放入Map中,但http://hackage.haskell.org/package/file-embed会将其放入已编译的二进制文件中.我们使用它在一些Web应用程序中嵌入模板.
Don*_*art 14
您可以将序列化数据类型存储为bytestring文字.这是一个例子:
但是,file-embed会自动执行此过程,从而可以更轻松地执行非平凡的嵌入.
所有方法基本上归结为将静态数据表示为字节串文字,
{-# LANGUAGE OverloadedStrings #-}
import Data.Binary
import qualified Data.Map as M
import qualified Data.ByteString.Char8 as S
import Data.ByteString.Lazy
import Codec.Compression.GZip
--
-- this is a gzip compressed literal bytestring, storing a binary-encoded Data.Map
--
mytable =
"\US\139\b\NUL\NUL\NUL\NUL\NUL\NUL\ETXEN\
\\219\SO\194 \f\197\224\188\196\CAN\227\US\
\\224\171~\NAKc\GS4ce\161`\178\191\215(\176\
\\190\180\167\231\210\n\241\171\203\191\ti\
\\157\217\149\249< \ENQ\214\&9>\202\162\179a\
\\132X\233\ESC=\231\215\164\SYN\157\DC2D\226*\
\\146\174o\t\167\DLE\209\"i_\240\193\129\199<W\
\\250nC\CAN\212\CAN\162J\160\141C\178\133\216;\
\\\@4\144-W\203\209x\205\140\166\RS\163\237]9f\
\\170\143\ACK\163g\223\STX\184\&7\rH\222\FSW\
\\130\&7D\197\NUL\164\&0U\193\186\t\186o\
\\228\180~\NUL\a6\249\137#\SOH\NUL\NUL"
main = print =<< M.lookup "ghc" m
where
-- build the table from the bytestring:
m :: M.Map String (Maybe String)
m = decode . decompress . fromChunks . return $ mytable
Run Code Online (Sandbox Code Playgroud)
您可以使用自定义Makefile
/ Setup.hs
钩子和调用windres
(如果您在Windows上)或objcopy
/ elfrc
(如果您在Linux上)将资源编译为COFF/ELF对象,然后可以将这些对象与Haskell对象文件组合以形成最终的可执行文件.然后,您可以使用像这样的Haskell FFI访问资源(未经测试):
-- We have an image resource called "_imgdata"
foreign import ccall "&" _imgdata :: CString
-- Size of _imgdata is 405585 bytes.
imgdata :: CStringLen
imgdata = (_imgdata, 405585)
Run Code Online (Sandbox Code Playgroud)
这个解决方案比使用file-embed(没有CString
- > ByteString
转换)更有效,但也更复杂.
另外,在我的cabal-install工作期间,我最终也需要资源文件支持,所以它可能会集成到Cabal的未来版本中(如果我将实现它).