2012-09-06 10 views
53

यदि आप declare a library + executable sections in a cabal file while avoiding double compilation of the library लाइब्रेरी को hs-source-dirs निर्देशिका में डालकर, तो आप आमतौर पर ghci और runhaskell के साथ अपनी प्रोजेक्ट नहीं चला सकते हैं, खासकर यदि निष्पादक के पास सहायक मॉड्यूल स्वयं हैं।लाइब्रेरी + एक्जिक्यूटिव के साथ हास्केल कैबल प्रोजेक्ट कैसे बनाएं जो अभी भी रनहास्केल/ghci के साथ चल रहा है?

क्या एक सिफारिश की परियोजना लेआउट कि

  • केवल बनाता है क्या एक बार की जरूरत है है
  • हैक्स के बिना एक साफ संरचना का उपयोग की अनुमति देता है runhaskell
  • गया है?

उत्तर

84

मान लेते हैं तो आप एक mylib पुस्तकालय चलाते हैं और mylib-commandline और mylib-server निष्पादनयोग्य।

mylib/      # Project root 
    mylib.cabal 
    src/      # Root for the library 
    tests/ 
    mylib-commandline/  # Root for the command line utility + helper modules 
    mylib-server/    # Root for the web service + helper modules 

पूर्ण निर्देशिका लेआउट:

mylib/      # Project root 
    mylib.cabal 
    src/      # Root for the library 
    Web/ 
     Mylib.hs    # Main library module 
     Mylib/ 
     ModuleA    # Mylib.ModuleA 
     ModuleB    # Mylib.ModuleB 
    tests/ 
    ... 
    mylib-commandline/  # Root for the command line utility 
    Main.hs     # "module Main where" stub with "main = Web.Mylib.Commandline.Main.main" 
    Web/ 
     Mylib/ 
     Commandline/ 
      Main.hs   # CLI entry point 
      Arguments.hs  # Programm command line arguments parser 
    mylib-server/    # Root for the web service 
    Server.hs    # "module Main where" stub with "main = Web.Mylib.Server.Main.main" 
    Web/ 
     Mylib/ 
     Server/ 
      Main.hs   # Server entry point 
      Arguments.hs  # Server command line arguments parser 

ठूंठ की तरह

आप ताकि प्रत्येक अपने स्वयं के परियोजना जड़ है, डबल संकलन से परहेज पुस्तकालय और प्रत्येक निष्पादन के लिए hs-source-dirs का उपयोग एंट्री पॉइंट फ़ाइल mylib-commandline/Main.hs इस तरह दिखता है:

module Main where 

import qualified Web.Mylib.Server.Main as MylibServer 

main :: IO() 
main = MylibServer.main 

आपको उनकी आवश्यकता है क्योंकि executable को मॉड्यूल पर शुरू करना चाहिए जिसे आसानी से Main कहा जाता है। ,

library 
    hs-source-dirs: src 
    exposed-modules: 
    Web.Mylib 
    Web.Mylib.ModuleA 
    Web.Mylib.ModuleB 
    build-depends: 
     base >= 4 && <= 5 
    , [other dependencies of the library] 

executable mylib-commandline 
    hs-source-dirs: mylib-commandline 
    main-is:   Main.hs 
    other-modules: 
    Web.Mylib.Commandline.Main 
    Web.Mylib.Commandline.Arguments 
    build-depends: 
     base >= 4 && <= 5 
    , mylib 
    , [other depencencies for the CLI] 

executable mylib-server 
    hs-source-dirs: mylib-server 
    main-is:   Server.hs 
    other-modules: 
    Web.Mylib.Server.Main 
    build-depends: 
     base >= 4 && <= 5 
    , mylib 
    , warp >= X.X 
    , [other dependencies for the server] 

cabal build पुस्तकालय और पुस्तकालय के दोहरे संकलन के बिना दो निष्पादनयोग्य का निर्माण करेगा, क्योंकि प्रत्येक अपने स्वयं के hs-source-dirs में है और निष्पादनयोग्य पुस्तकालय पर निर्भर करते हैं:

आपका mylib.cabal इस तरह दिखता है।

आप अभी भी अपनी परियोजना जड़ से runghc साथ निष्पादनयोग्य चलाने -i स्विच का उपयोग बताने के लिए जहां यह मॉड्यूल (विभाजक के रूप में : का प्रयोग करके) के लिए देखो करेगा कर सकते हैं:

runhaskell -isrc:mylib-commandline mylib-commandline/Main.hs 

runhaskell -isrc:mylib-server mylib-server/Server.hs 

इस तरह, आप एक हो सकता है स्वच्छ लेआउट, सहायक मॉड्यूल के साथ निष्पादन योग्य, और सब कुछ अभी भी runhaskell/runghc और ghci के साथ काम करता है। बार-बार इस ध्वज टाइपिंग से बचने के लिए, आप अपने .ghci फाइल करने के लिए

:set -isrc:mylib-commandline:mylib-server 

को कुछ इसी तरह जोड़ सकते हैं।


ध्यान दें कि कभी-कभी आपके कोड को अलग-अलग पैकेजों में विभाजित करना चाहिए, उदा। mylib, mylib-commandline और mylib-server

+0

बिल्कुल सही जवाब, मैं आधिकारिक हास्केल पेजों पर इतना सरल और सीधा लेख ढूंढ रहा था लेकिन बिना किसी किस्मत के। शायद मैंने पर्याप्त समय खोज नहीं किया लेकिन इससे मुझे बहुत मदद मिली। धन्यवाद! – korCZis

3

आप cabal repl का उपयोग कैबल फ़ाइल से कॉन्फ़िगरेशन के साथ ghci शुरू करने और एक्जिक्यूटिव को चलाने और चलाने के लिए cabal run का उपयोग कर सकते हैं।runhaskell और ghci के विपरीत, cabal repl और cabal run का उपयोग करके कैबल सैंडबॉक्स से निर्भरता भी सही ढंग से उठाती है।

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