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

Difference between "source-repository-package" and "local no-index repositories" in Cabal

我知道我可以 add a local package to a cabal project by listing it in the packages: section of the cabal.project 归档。最简单的例子是 packages: ..

cabal.project我还可以加上这两个东西:

好像他们两个都让我给项目加包。两者有什么区别?

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

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

后运行cabal build时会重新下载

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


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

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