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

15

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

执行stack build后,我收到以下错误提示,表明我需要将Euterpea添加到我的.cabal文件的build-depends部分。

$ 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,然后我的.cabal文件中的library部分如下。

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>进行自动初始化。我不知道我可能与以前的项目有何不同,导致stack build出现这种意外行为。
2个回答

19

请确保项目目录根目录下存在package.yaml文件。

package.yaml是一种新的文件格式,通过hpack转换来改善cabal语法。

Stack强烈支持hpack,因此stack build命令会自动使用hpack命令将package.yaml转换为cabal文件。

如果需要添加Euterpea包,请删除package.yaml文件或编辑它。由于其格式为YAML,因此编辑并不难。


2
哦,哇,这真的有助于解释我生命中最后几分钟的事情! - Jesse Hallett

2
我想要补充山本雄二的答案。这个解决方案是绝对正确的。但我只想添加一些东西,编辑package.yaml并不难。 步骤1:最棘手的部分是找到正确的软件包名称

使用HoogleStackage查找模块所在的软件包。在这篇文章中了解更多关于如何查找软件包名称的信息。

步骤2:现在你需要打开package.yaml文件并添加软件包名称。在你的情况下,在依赖列表中添加'Euterpea'软件包。
dependencies:
...
- your-package-name

请注意,Euterpea包需要以不同的方式添加。请阅读此帖子以获得更好的理解。 步骤3:在项目根目录中打开project-name.cabal并在build-depends下添加所需的软件包名称:
library
  hs-source-dirs:
      src

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

  exposed-modules:
      Lib

第四步: 输入stack build来下载和构建依赖项(如果您计划在REPL中使用它,则输入stack ghci)

希望这能够起作用!愉快的编程!:)


1
这个最后的答案与我最终解决这个问题所做的相似。不得不同时编辑 package.yaml 和项目的 .cabal 文件。我了解到一些包名,无论是在 Hackage 上还是在这两个文件中,都将是小写的(text、hspec),而其他的则不是(QuickCheck)。 - Ben Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接