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

Sev*_*ian 5 haskell cabal

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

我正在尝试使用 MyLib 中的 Graphics.Gloss 包。如果我gloss同时包含build-dependsoflibraryexecutable.

这是 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
Run Code Online (Sandbox Code Playgroud)

MyLib.hs

module MyLib (someFunc) where
import Graphics.Gloss

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

Run Code Online (Sandbox Code Playgroud)

主文件

module Main where

import qualified MyLib (someFunc)
import HaskellSay (haskellSay)

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

Run Code Online (Sandbox Code Playgroud)

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

Li-*_*Xia 5

你可以让它工作。您当前的设置存在问题,即库文件和可执行文件位于同一目录中。另请参阅此问题如何避免在此 cabal 文件中重新编译?这是同一潜在问题的症状:当您构建可执行文件时,它会MyLib从头开始重建(这需要光泽依赖),而不是重用已经构建的库。

MyLib/
  ray-tracer.cabal
  MyLib.hs
  Main.hs       # Bad
Run Code Online (Sandbox Code Playgroud)

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

MyLib/
  MyLib.cabal
  src/
    MyLib.hs
  exe/
    Main.hs
Run Code Online (Sandbox Code Playgroud)

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

library
  hs-source-dirs: src
  ...

executable ray-tracer
  hs-source-dirs: exe
  ...
Run Code Online (Sandbox Code Playgroud)