在cabal-dev中使用--reinstall标志

时间:2011-09-16 23:19:12

标签: haskell ghc cabal

我正在研究wxHaskell库,并且希望将我的开发工作与hackage的稳定wxHaskell分开,我正在以下列方式使用cabal-dev

  1. 我从darcs获得了wxHaskell的源代码;
  2. 因为wxHaskell是comprised of three components我使用cabal-dev add-source添加每个wxwxcorewxdirect);
  3. 然后,按照预期,我可以通过执行cabal-dev install wx安装到沙箱本地包库中,检测到依赖项并构建和安装所有内容。
  4. 最后,我使用ghc -package-conf成功运行了测试代码,以指定沙盒包数据库的位置。
  5. 当我对wxHaskell源进行修改时出现问题。为了构建和安装更新的代码,我必须使用cabal-dev install --reinstall,这是有意义的,因为我没有增加版本号;构建发生,我看到“在...中安装库”和“注册...”,但我在代码中所做的更改不存在于重新编译的沙箱库中。

    我目前的工作是删除cabal-dev库,并在每次要重建时重复该过程。

2 个答案:

答案 0 :(得分:2)

更新: cabal-install> = 1.18支持沙盒,并且比cabal-dev更好地维护。 Cabal-install还支持使用带沙箱的add-source。以下是cabal-install中新沙盒功能的说明:http://coldwa.st/e/blog/2013-07-30-Cabal-sandbox.html

旧回答:

正如您所发现的那样,'add-source'并不适用于积极改变项目。我不确定那里有一个很好的解决方案 - 很难跟踪一个add-source'd项目的位置(至少没有现有的基础设施),而且我不确定是否总是对的。

另一个工作流程可能会更好地为您服务 - 只需使用cabal-dev install,指向您希望用于未来开发的沙箱。最近版本的cabal工具链(我的意思是Cabal,cabal-install和cabal-dev)允许这样的事情:

$ ls 
wx        wxcore          wxdirect
$ cabal-dev install --sandbox=<path-to-some-sandbox> ./wx ./wxcore ./wxdirect
...

(注意:我没有用WX对此进行测试 - 可能会出现我不知道的扭结!)

假设一切按预期进行,将把本地子目录中的三个软件包安装到指定的沙箱中。更新源只是意味着为已更改的项目重新发出cabal-dev install命令。

请记住,您必须自己以正确的顺序发出重复的cabal-dev安装命令,您必须使用上面的批处理命令和更新相应的版本号。

我没有声称这是理想的;)但我认为这比每次删除沙箱更好。

答案 1 :(得分:1)

经过一番调查后,我可以确认这是由于我对add-source的使用存在误解的结果,详见the README的“使用沙箱本地黑客”部分,详情请参阅此处(强烈是我自己添加的,表明了我误解的原因):


Cabal-dev还允许您使用未发布的包,就像它们一样 与cabal-dev add-source进行了讨价还价。

例如,仅linux-ptraceposix-waitpid个包 最近上传到hackage。以前,cabal-dev用于构建 依赖于这两个包的应用程序:

$ ls
linux-ptrace/  myProject/  posix-waitpid/
$ cd myProject
$ cabal-dev add-source ../linux-ptrace ../posix-waitpid
$ cabal-dev install

请注意,cabal-dev add-source接受源位置列表。

但请注意,因为已添加的软件包不是 再次与他们原始的源位置相关联。改变了 上面示例中的linux-ptrace源将不会被使用 myProject除非用户发出cabal-dev add-source 再次linux-ptrace来源的路径。这类似于 您现在可以执行cabal install步骤以使项目能够使用 改变了依赖。