我如何 link cabal 库和可执行文件?

How do I link cabal library and executable?

cabal-version:      3.4
name:               SudokuSolver
version:            0.1.0.0
build-type:         Simple

library sud
    build-depends:
            base
          , text
    hs-source-dirs: lib
    exposed-modules: Sud.Rdg
    default-language: Haskell2010

executable suSol
    default-language: Haskell2010
    hs-source-dirs: app
    main-is: Main.hs
    build-depends:    
            base
          , optparse-applicative
          , filepath
          , text

当我运行“cabal build sud”时一切正常。 然而,当我 运行 "cabal build suSol" 我得到以下错误:

Could not load module ‘Sud.Rdg’ ~ │ It is a member of the hidden package ‘SudokuSolver-0.1.0.0’. ~ │ Perhaps you need to add ‘SudokuSolver’ to the build-depends in your .cabal file. ~ │ Use -v (or :set -v in ghci) to see a list of the files searched for.

这是我有点不知所措的地方,cabal 建议我将这个项目本身添加为构建依赖项?如果我这样做,我会得到:

Error: Dependency on unbuildable package SudokuSolver
│ In the stanza 'executable suSol' | In the inplace package 'SudokuSolver-0.1.0.0'

这对我来说很有意义,显然你不能将自己添加为构建依赖项。

但是我在这里错过了什么?

编辑:

如果我将 sud 添加到 build-depends 和“cabal build suSol”我得到:

Resolving dependencies...
cabal: Could not resolve dependencies: [__0] trying: SudokuSolver-0.1.0.0 (user goal) [__1] unknown package: sud (dependency of SudokuSolver) [__1] fail (backjumping, conflict set: SudokuSolver, sud) After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: SudokuSolver, sud

当您为库添加名称时,这意味着它是您包的私有库或内部库。似乎 cabal 目前有一个错误,它会导致令人困惑的错误消息要求您将 SudokuSolver 添加到您的可执行文件的构建依赖项中,您可以改为添加 SudokuSolver:sud.

然而,更常见的是保持库未命名(或给它与包相同的名称),这使它成为主要的 public 库。然后库的名称与包的名称相同,因此您应该真正将 SudokuSolver 添加到可执行文件的构建依赖项中。这是长期以来唯一可能的选择,内部图书馆相对较新。这可能也是为什么仍然存在一些这样的问题的原因。

我还注意到您可以按照 Willem van Onsem 的说法添加 sud,但前提是您使用 cabal-version: 3.0 或更早版本。使用 cabal-version: 3.4 你必须使用 SudokuSolver:sud (package-name:internal-library-name) notation.

编辑:我已经打开 an issue on the cabal GitHub repo