Powiedz, że mam plik dictionary.txt
, muszę go odczytać na mapie i użyć go w moim programie, jak utworzyć plik dictionary.txt zawarty w skompilowanym pliku exe?Jak skompilować zasobu do pliku binarnego w Haskell?
Odpowiedz
Typy danych zserializowanych można zapisywać jako wartości bytestować literały. Oto przykład:
- http://code.haskell.org/~dons/code/compiled-constants/
- http://haskell.org/haskellwiki/Compiling_in_constants
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
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.
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ę).
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.
- 1. jak skompilować nodejs do pojedynczego, w pełni statycznego pliku binarnego
- 2. Jak dołączyć dane do pliku binarnego?
- 3. Ścieżka do pliku binarnego w C
- 4. Jak skompilować pliki HTML do pliku CHM?
- 5. Jak zmusić Mercurial (hg) do traktowania pliku jako pliku binarnego?
- 6. Deserializacja części pliku binarnego
- 7. Wysyłanie pliku binarnego w Tornado
- 8. Jak lista wyjście pływaków do pliku binarnego w Pythonie
- 9. Pobieranie pliku binarnego
- 10. Generowanie losowego pliku binarnego
- 11. dane Suwnice pisząc do binarnego pliku
- 12. Jak wstawić polecenie LC_LOAD_DYLIB do pliku binarnego Mach-O lub dołączyć do biblioteki statycznej do istniejącego pliku binarnego (IOS)
- 13. Używanie jquery ajax do pobrania pliku binarnego
- 14. Jak uzyskać ścieżkę do zasobu w pliku JAR Java
- 15. Fiddler dodaje dane pliku binarnego do POST
- 16. Konwersja pliku HEX firmy Intel do pliku binarnego
- 17. Jak można dokonać inżynierii wstecznej pliku binarnego?
- 18. Jak odwołać się do zasobu w Javie?
- 19. Jak wygenerować plik PDF z pliku binarnego?
- 20. Przesyłanie pliku binarnego na Node.js
- 21. Parsowanie pliku binarnego w języku Ruby
- 22. Czytanie i pisanie int do pliku binarnego w języku C++
- 23. Jak wstawić komendę LC_LOAD_DYLIB do pliku binarnego Mach-O (OSX)
- 24. Czytanie pliku binarnego z pythonem
- 25. Jak zastąpić niektóre bajty pliku binarnego dd?
- 26. Określanie typu pliku binarnego/tekstowego w Javie?
- 27. zapis/odczyt pliku binarnego w Nim
- 28. Jak wybrać tylko część ogromnego pliku binarnego (pliku)?
- 29. Jak skompilować mój kod TypeScript dla Node.js do jednego pliku?
- 30. Jak skompilować aplikację Angular2 TypeScript do pojedynczego pliku?
Czy osadzanie plików nie jest wymagane przez użytkownika końcowego od czasu jego szablonu? – alternative
Czy ma sens osadzenie pliku wykonywalnego? –