Cabal 中“source-repository-package”和“local no-index repositories”的区别

问题描述

我知道我可以通过在 add a local package to a cabal project 文件packages: 部分列出它来 cabal.project。使用单个本地包创建项目的最简单示例是 packages: .

cabal.project 中,我还可以添加以下两点:

  • source-repository-package 部分:

      source-repository-package
          type: git
          location: git@github.com:haskell-streaming/streaming.git
          tag: eb3073e6ada51b2bae82c15a9ef3a21ffa5f5529
    
  • local no-index repositories 的定义

      repository my-local-repository
          url: file+noindex:///home/zzz/no-index-repo-dir
    

似乎他们都让我将包添加到项目中。两者有什么区别?

注意:这个问题与名称相似的 source-repository: 字段无关,它只是说明哪个是与包的源代码相关联的存储库。)

解决方法

实际上只有 source-repository-package 向您的项目添加了“本地包”。它的行为与在 packages: 中列出包的源文件夹非常相似,只是根据需要下载源代码。特别是,在 cabal build 之后运行 cabal clean 时,它将被重新下载。

因为它是你项目中的本地包,其他 cabal 项目不知道它。添加到其他本地项目需要重新编译。


同时,local no-index package repositories 是 Hackage 或 Stackage 意义上的存储库,仅在本地文件系统中。它们可以在单个项目的 cabal.project 文件或全局 cabal 配置 (~/.cabal/config) 中指定。

在这些存储库中找到的包不被视为项目的“本地包”。它们的库编译一次,并在知道包存储库的所有项目之间共享(如果存储库在 ~/.cabal/config 中列出,则为所有项目)。而 cabal build 之后的 cabal clean 不会触发重新编译。