首先,我是在 Haskell 中使用 cabal 和外部包的新手。
我正在尝试使用 MyLib 中的 Graphics.Gloss 包。如果我gloss同时包含build-dependsoflibrary和executable.
这是 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依赖项中时不起作用?
你可以让它工作。您当前的设置存在问题,即库文件和可执行文件位于同一目录中。另请参阅此问题如何避免在此 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)