2011-06-19 8 views

Odpowiedz

12

Typy danych zserializowanych można zapisywać jako wartości bytestować literały. Oto przykład:

Jednak file-embed automatyzuje ten proces, dzięki czemu łatwiej zrobić nietrywialne zanurzeń.

Wszystkie podejścia w istocie sprowadzają się do reprezentowania danych statycznych jako bytestring dosłownym,

{-# 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 
21

Będziesz musiał wymyślić własny sposób, aby umieścić go na mapie, ale http://hackage.haskell.org/package/file-embed dostanie go do skompilowanego pliku binarnego. Używamy go do osadzania szablonów w niektórych naszych aplikacjach internetowych.

+0

Czy osadzanie plików nie jest wymagane przez użytkownika końcowego od czasu jego szablonu? – alternative

+0

Czy ma sens osadzenie pliku wykonywalnego? –

6

Można użyć niestandardowego Makefile/Setup.hs hak i powołać windres (jeśli jesteś w systemie Windows) lub objcopy/elfrc (jeśli jesteś na Linuksie) do kompilowania zasobów COFF/ELF obiektów, które można następnie łączyć z Twoje pliki obiektów Haskell, aby utworzyć ostateczny plik wykonywalny. Następnie można uzyskać dostęp do zasobów za pomocą Haskell FFI jak to (nie testowane):

-- We have an image resource called "_imgdata" 
foreign import ccall "&" _imgdata :: CString 

-- Size of _imgdata is 405585 bytes. 
imgdata :: CStringLen 
imgdata = (_imgdata, 405585) 

To rozwiązanie będzie bardziej wydajny niż przy użyciu file-embed (brak CString ->ByteString konwersje dzieje), ale również bardziej zaangażować.

Na marginesie, potrzebowałem również wsparcia dla plików zasobów during my work on cabal-install, więc prawdopodobnie zostanie zintegrowany z pewną przyszłą wersją Cabala (jeśli ją zaimplementuję).

6

gorąco polecam użyć Template Haskell tutaj, aby załadować plik i przekształcić go w Haskell typu danych. Zostanie on nie tylko skompilowany do ostatecznego pliku binarnego, ale również w pełni zoptymalizowany.

Powiązane problemy