将cabal链接到本地​​图书馆

时间:2013-08-06 16:15:52

标签: haskell cabal

MyLib成为我的本地Haskell库。我可以使用cabal build构建它并使用cabal install进行安装,但是我可以在其他项目中使用它吗没有安装步骤吗?

我正在开发几个库并在每次更改后安装它们都不是一个好的解决方案。

2 个答案:

答案 0 :(得分:2)

我们假设您有两个完全独立的项目,一个名为my-library,另一个名为my-projectmy-project取决于my-library

构建my-library并将其提供给其他项目的方法是cabal install my-library。完成后,任何其他项目都可以使用该库。

现在,您已准备好使用命令my-project构建cabal install my-project。它将重建或重新安装my-library,但它会将您的项目与库链接。

现在,如果您对my-library进行了修改,请务必在运行cabal install my-library之前更新版本号。如果您忘记了版本号,则会收到警告,my-project将被淘汰。现在,您的库的旧版本和新版本可用于其他项目。

您可以继续运行您的项目。他们很乐意继续使用my-library 的先前版本,直到您再做cabal install my-project。因此,无需在每次更改后重新安装所有内容。

如果您确实想要重建项目,但继续使用旧版本的库,则可以在cabal文件的build-depends部分指定。例如,如果您安装了my-library版本1.0和2.0,则可以针对旧版本构建项目,如下所示:

build-depends: my-library==1.0, ...

答案 1 :(得分:2)

您的问题没有很好的解决方案,但您可以使用沙箱来保持您的开发环境更清洁。

使用cabal-1.18或更新版本,您可以使用cabal sandbox init创建一个沙箱,然后您可以安装到该沙箱或添加源(cabal sandbox add-source <path to library>)。

这有助于将不稳定的库(及其可能不稳定的依赖关系)保留在用户包数据库之外,这有助于防止“cabal hell”(依赖关系之间无法解决的冲突)。但是,这不会直接有助于减少每次要进行顶级构建时需要发出的命令数。

可以做的是设置一个执行add-source命令并构建顶级包的简单脚本。例如:

#!/bin/bash
cabal sandbox init # a no-op if the sandbox exists.
cabal sandbox add-source ../MyLib
cabal install --dependencies-only
cabal build

当然,您之前可以这样做,但这次您也可以通过清理沙箱轻松清理(删除所有已安装的工件):

cabal sandbox delete