我使用 cabal 软件包管理器来安装 Haskell 程序的库和我从一些存储库克隆的新项目。我经常遇到问题。大多数项目的安装看起来都非常简单,但对我来说并非总是如此 - 有时它们很难运行。事实上,有些项目太难了,以至于我因为无法安装而对项目失去了兴趣。
所以我不想抱怨,而是想问问我应该怎么做才能改善这种情况。我想用我最近遇到的问题作为例子。
我有兴趣尝试Gitit 项目。这是一个看起来很有前途的个人 wiki,可以在各种版本控制系统上运行。
这就是我所做的:
- 克隆自Github
cabal install
按照我在项目安装页面上所说的那样在项目目录中运行:mika@eka:~/git/gitit$ ls BLUETRIP-LICENSE CHANGES HCAR-gitit.tex LICENSE Network README.markdown RELANN-0.6.1 Setup.lhs TANGOICONS YUI-LICENSE data expireGititCache.hs gitit.cabal gitit.hs plugins mika@eka:~/git/gitit$ cabal install Resolving dependencies... cabal: cannot configure happstack-server-7.0.7. It requires base64-bytestring ==1.0.* For the dependency on base64-bytestring ==1.0.* there are these packages: base64-bytestring-1.0.0.0. However none of them are available. base64-bytestring-1.0.0.0 was excluded because gitit-0.10 requires base64-bytestring ==0.1.* mika@eka:~/git/gitit$
所以现在我在想:好吧,我将单独安装 happstack-server,也许这会起作用:
mika@eka:~/git/gitit$ cabal install happstack-server Resolving dependencies... Warning: happstack-server.cabal: Ignoring unknown section type: test-suite Configuring happstack-server-7.0.7... cabal: At least the following dependencies are missing: blaze-html ==0.5.*, hslogger >=1.0.2, monad-control ==0.3.*, network >=2.2.3, sendfile >=0.7.1 && <0.8, system-filepath >=0.3.1, text >=0.10 && <0.12, threads >=0.5, transformers-base ==0.4.* cabal: Error: some packages failed to install: happstack-server-7.0.7 failed during the configure step. The exception was: ExitFailure 1
看起来缺少一些依赖项。但安装这些依赖项难道不是使用 cabal 的首要目的吗?
我该怎么办?提交错误报告(提交给哪个项目?)、手动安装依赖项还是其他什么?解释导致此类问题的原因可获得加分。
答案1
具有复杂依赖关系的项目(包括最有可能适合此类的 Web 服务器)通常最好使用cabal-dev而不是 cabal。前者将所有内容安装在沙盒中,不会干扰其他安装。
因此你应该先安装一个全新的Haskell 平台,然后 fork 存储库并最终使用 cabal-dev 进行构建。当然,cabal-dev install gitit
如果您不想在源代码上工作,也可以安装 gitit。
您应该避免对复杂项目进行全局安装。
答案2
对于任何偶然发现这一点的人来说,我发现了两件重要的事情,可以让阴谋变得不那么痛苦。
首先,从 cabal-install 1.18 开始内置了沙盒(您不再需要 cabal-dev)。您应该使用 进行升级cabal install cabal-install
,并将它们用于一切!我~/.cabal/sandboxes
为每个构建创建并放置了一个沙盒。然后我将完成的二进制文件链接~/.cabal/bin
到ln
。
其次,如果您的发行版(例如 Debian)不授予/tmp
执行权限,则会导致各种看似无关的错误。诸如此类configure: error: cannot run C compiled programs
。使用 很容易修复alias cabal="TMPDIR=/somewhere/with/permission cabal"
。