2011-06-19 19 views
21

कहें कि मेरे पास dictionary.txt फ़ाइल है, मुझे इसे मानचित्र में पढ़ने और इसे अपने प्रोग्राम में उपयोग करने की आवश्यकता है, मैं संकलित exe फ़ाइल में इस शब्दकोश.txt फ़ाइल को कैसे बना सकता हूं?हास्केल में बाइनरी में संसाधन कैसे संकलित करें?

उत्तर

12

आप सीरियलाइज्ड डेटा प्रकारों को बाइटस्ट्रिंग अक्षर के रूप में स्टोर कर सकते हैं। यहाँ एक उदाहरण है:

हालांकि, file-embed इस प्रक्रिया को स्वचालित, यह आसान गैर तुच्छ embeddings करने के लिए बना रही है।

सभी दृष्टिकोण अनिवार्य रूप से एक bytestring शाब्दिक रूप में स्थिर डेटा का प्रतिनिधित्व करने के लिए नीचे उबाल,

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

आपको इसे मानचित्र में लाने के लिए अपने तरीके से आना होगा, लेकिन http://hackage.haskell.org/package/file-embed इसे आपके संकलित बाइनरी में लाएगा। हम इसे अपने कुछ वेब अनुप्रयोगों में टेम्पलेट एम्बेड करने के लिए उपयोग करते हैं।

+0

क्या इसके टेम्पलेट के बाद से अंतिम उपयोगकर्ता द्वारा फ़ाइल-एम्बेड की आवश्यकता नहीं है? – alternative

+0

क्या निष्पादन योग्य फ़ाइल को एम्बेड करना समझ में आता है? –

6

आप एक कस्टम Makefile/Setup.hs हुक का उपयोग करें और windres आह्वान कर सकते हैं (यदि आप Windows पर हैं) या objcopy/elfrc (यदि आप लिनक्स पर कर रहे हैं) Coff/ELF वस्तुओं है जिसे आप के साथ गठजोड़ कर सकते हैं करने के लिए संसाधनों को संकलित करने के अंतिम निष्पादन योग्य बनाने के लिए आपकी हास्केल ऑब्जेक्ट फ़ाइलें। फिर आप इस तरह हास्केल FFI (नहीं परीक्षण किया) का उपयोग कर संसाधनों का उपयोग कर सकते हैं:

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

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

यह समाधान file-embed का उपयोग कर से अधिक कुशल हो जाएगा (कोई CString ->ByteString रूपांतरण चल रहा), लेकिन यह भी अधिक शामिल।

एक तरफ, मुझे संसाधन फ़ाइल समर्थन during my work on cabal-install की आवश्यकता भी समाप्त हो गई, इसलिए इसे शायद कैबल के कुछ भविष्य के संस्करण में एकीकृत किया जाएगा (यदि मैं इसे कार्यान्वित करूंगा)।

6

मैं दृढ़ता से यहां Template Haskell उपयोग करने के लिए, फ़ाइल को लोड और यह एक हास्केल डाटाटाइप में बदल जाने की सिफारिश करेंगे। यह न केवल अंतिम बाइनरी में संकलित किया जाएगा, बल्कि पूरी तरह अनुकूलित भी होगा।

संबंधित मुद्दे