在 cabal 文件的库或可执行部分中构建依赖项?

Build dependency in library or executable section of cabal file?

首先,我是 Haskell 使用 cabal 和外部包的新手。

我正在尝试使用 MyLib 中的 Graphics.Gloss 包。如果我在 libraryexecutablebuild-depends 中都包含 gloss,我可以让它工作。

这里是 cabal 文件的相关部分:

library
  exposed-modules:     MyLib
  build-depends:       base ^>=4.13.0.0,
                       gloss ^>=1.13.1.1
  default-language:    Haskell2010

executable ray-tracer
  main-is:             Main.hs
  other-modules:       MyLib
  build-depends:       base ^>=4.13.0.0, ray-tracer,
                       haskell-say ^>=1.0.0.0,
                       gloss ^>=1.13.1.1

MyLib.hs

module MyLib (someFunc) where
import Graphics.Gloss

someFunc :: IO ()
someFunc = display (InWindow "My Window" (200,200) (10,10)) white (Circle 80)

Main.hs

module Main where

import qualified MyLib (someFunc)
import HaskellSay (haskellSay)

main :: IO ()
main = do
  MyLib.someFunc

gloss 仅包含在 library 依赖项中时,为什么这不起作用?

你可以让它发挥作用。您当前的设置存在问题,即库文件和可执行文件位于同一目录中。另请参阅此问题 How to avoid recompiling in this cabal file?,这是同一潜在问题的症状:当您构建可执行文件时,它会从头开始重建 MyLib(这需要 gloss 依赖项),而不是重新使用已经构建的库.

MyLib/
  ray-tracer.cabal
  MyLib.hs
  Main.hs       # Bad

.hs 文件移动到单独的目录中(技术上你只需要移动其中一个,但我认为最好保持根目录尽可能统一):

MyLib/
  MyLib.cabal
  src/
    MyLib.hs
  exe/
    Main.hs

并在 cabal 文件中,将 hs-source-dirs: srchs-source-dirs: exe 添加到相应的部分:

library
  hs-source-dirs: src
  ...

executable ray-tracer
  hs-source-dirs: exe
  ...