为什么`stack build`改变我的.cabal文件?

时间:2017-12-09 03:20:49

标签: haskell cabal haskell-stack

我正在尝试构建一个使用Euterpea的项目。

正在运行contains(item)我收到以下错误消息,建议我需要将stack build添加到Euterpea文件的build-depends部分。

.cabal

我在那里添加$ sb composition-0.1.0.0: build (lib + exe) Preprocessing library composition-0.1.0.0... [2 of 2] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-linux-nix/Cabal-1.24.2.0/build/Lib.o ) /home/matthew/backup/composition/composition/src/Lib.hs:5:1: error: Failed to load interface for ‘Euterpea’ It is a member of the hidden package ‘Euterpea-2.0.4’. Perhaps you need to add ‘Euterpea’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. -- While building package composition-0.1.0.0 using: /home/matthew/.stack/setup-exe-cache/x86_64-linux-nix/Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack-work/dist/x86_64-linux-nix/Cabal-1.24.2.0 build lib:composition exe:composition-exe --ghc-options " -ddump-hi -ddump-to-file" Process exited with code: ExitFailure 1 ,然后Euterpea文件的library部分如下。

.cabal

然而,当我再次运行library hs-source-dirs: src build-depends: base >= 4.7 && < 5 , Euterpea exposed-modules: Lib other-modules: Paths_composition default-language: Haskell2010 时,它会出现同样的错误 - 并将我的stack build文件更改回原来的状态,然后.cabal部分看起来像

library

为什么library hs-source-dirs: src build-depends: base >= 4.7 && < 5 exposed-modules: Lib other-modules: Paths_composition default-language: Haskell2010 会改变我的stack build文件?我以前从未见过这种情况。

旁注: 不确定它是否相关,但cabal文件的格式似乎与通常不同。与以前的项目一样,我通过运行.cabal自动初始化。我不知道我可能做的与以前的项目有什么不同,导致stack new <project-name>的这种意外行为。

2 个答案:

答案 0 :(得分:7)

确保项目目录的根目录中存在package.yaml

package.yaml是一种新的文件格式,用于改进由hpack转换的cabal语法。

Stack支持hpack,因为stack build命令会自动将package.yaml转换为带有hpack命令的cabal文件。

因此,请删除package.yaml或修改package.yaml以添加Euterpea包。 编辑它并不困难,因为它的格式是YAML。

答案 1 :(得分:1)

我想补充 YAMAMOTO Yuji's 的答案。解决方案是绝对正确的。但我只想添加一些东西,编辑 package.yaml 并不难。

第 1 步:最棘手的部分是找到正确的包名称

<块引用>

使用 HoogleStackage 查找模块所在的包 居住。详细了解如何在此 post 中查找包名称。

第 2 步:现在您必须打开 package.yaml 文件并添加包名称。在您的情况下,在依赖项列表中添加 'Euterpea' 包。

dependencies:
...
- your-package-name
<块引用>

请注意,Euterpea 包必须以不同的方式添加。请阅读this post以获得更好的理解。

第 3 步:在项目根目录中打开 project-name.cabal 并在 build-depends 下添加所需的包名称:

library
  hs-source-dirs:
      src

  build-depends:
      base >= 4.7 && < 5
    , your-package-name

  exposed-modules:
      Lib

第 4 步:发出 stack build 以下载和构建依赖项 (或 stack ghci,如果您打算在 REPL 中使用它)

希望这有效!快乐编码! :)