问题描述
我知道我可以通过在 add a local package to a cabal project 文件的 packages:
部分列出它来 cabal.project
。使用单个本地包创建项目的最简单示例是 packages: .
。
在 cabal.project
中,我还可以添加以下两点:
-
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
不会触发重新编译。