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