۱۳ - ۴تبدیل پروژهمون به کتابخونه
اول یه پاراگراف ِ library به فایلِ hello.cabal اضافه میکنیم:
library
hs-source-dirs: src
exposed-modules: Hello
build-depends: base >= 4.7 && < 5
default-language: Haskell2010بعد هم یه فایل به آدرسِ src/Hello.hs میسازیم:
module Hello where
sayHello :: IO ()
sayHello = do
putStrLn "hello world"بعد از اون هم ماژول ِ Main رو تغییر میدیم تا از این تابعِ کتابخونه استفاده کنه:
module Main where
import Hello
main :: IO ()
main = do
sayHelloحالا اگه بسازمِش و بعد اجرا، کار میکنه.
$ stack build
$ stack exec hello
hello worldاما اگه میخواستیم یه آدرس جدا برای exe میداشتیم چطور؟
$ mkdir exe
$ mv src/Main.hs exe/Main.hs
- ^------------------------^
- Main.hs م. انتقالِاونموقع باید فایلِ .cabal رو هم ویرایش کنیم تا بدونه hello از پوشهی exe استفاده میکنه:
executable hello
hs-source-dirs: exe
main-is: Main.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5اگه سعی کنین این رو بسازین، نمیشه.
hello/exe/Main.hs:3:8:
Could not find module ‘Hello’
It is a member of the hidden package
‘hello-0.1.0.0@hello_IJIUuynUbgsHAquBKsAsb5’.
Perhapse you need to add ‘hello’ to the
build-depends in your .cabal file.
Use -v to see a list of the files searched for.دو راه داریم که این رو درست کنیم، یکیشون بهتر از اون یکیه. یه راه اینه که به آدرسهایی که executable جستجو میکنه src هم اضافه کنیم. اما پیشنهاد Cabal دقیقاً درسته. راه بهتر اینه که به حدومرزِ بینِ کتابخونه و اجراشدنی احترام بذاریم، و در عوض کتابخونه ِ خودمون رو به عنوان یکی از وابستگیها اضافه کنیم:
executable hello
hs-source-dirs: exe
main-is: Main.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5
, helloبا این تغییرات، build کار میکنه. تشخیصِ اینکه چه چیزهایی رو کتابخونهتون صادر یا افشا میکنه هم راحتتر میشه، که متعاقباً باعث میشه در صورتِ لزوم سریعتر اونها رو تغییر بدین.