cabal-install 和 Debian

13

这是一个有点私人问题,但也许人们会有好的建议或解决办法。

问题涉及在Debian下安装cabal-install和haskell-platform。

当您使用apt-get install haskell-platform安装时,它附带了cabal-install,并且它的命令cabal可用。

现在这个cabal-install不是最新的:

> which cabal
/usr/bin/cabal
> /usr/bin/cabal --version
cabal-install version 0.8.0
using version 1.8.0.2 of the Cabal library

然而,我的理解是运行 cabal update 命令可以更新 cabal,但由于它不属于“Debian 东西”,所以它会将其放在~/.cabal/bin/中。

> ~/.cabal/bin/cabal --version
cabal-install version 0.8.2
using version 1.8.0.2 of the Cabal library
现在我的系统有两个Cabal,而使用cabal命令获取的不是我想要使用的那个...因为它会继续更新另一个而不是自己,因此无效。
所以我在~/.bashrc中进行了别名设置:
alias cabal='~/.cabal/bin/cabal'

现在:

> cabal --version
cabal-install version 0.8.2
using version 1.8.0.2 of the Cabal library

所以,我的最终问题:

  • 是否有一个Deb软件库拥有Cabal 0.8.2?
  • 我的当前解决方案会导致问题吗?(例如,which cabal仍然指向我无用的/usr/bin/cabal,因此如果脚本使用这个命令,它们将被愚弄...)
  • 是否有人提出了更好的解决方案?(我的解决方案有点临时,但这是我对背后发生的事情知之甚少的唯一想到的...)
  • 如果我上面说的有任何错误或不准确的地方,请纠正我。

2
我不明白为什么 Haskell 需要自己的包管理器,而其他语言却没有。 - harpo
5
许多编程语言都有自己的包管理器,比如 Ruby 社区非常流行的 RubyGems。 - dbyrne
Ruby 的 gem,Python 的 pip 或 easy_install,Java 的 Maven 及其衍生版本...... 对于那些广泛使用第三方库的人来说,依赖于操作系统的软件包管理系统并不总是最佳选择。特别是在像 Debian 这样保守的操作系统上。作为客户端(而不是开发者),我必须跟上一些正在积极开发中的库的最新版本,手动安装它们每次都会很麻烦。 - Rafael S. Calsaverini
1
Haskell 没有包管理器。它有一个构建管理器,可以解决构建依赖关系。如果您已经构建了库,则 Cabal 将无法帮助您,您应该使用 apt、yum 或 pacman。 - nomen
@harpo:原因是Windows/Mac缺乏这样基本的设施(至少在理智的意义上),所以他们的用户不知道比为每个应用程序创建自己的更新程序和为每种语言创建包管理器更好的方法。他们只知道“应用商店”。这就像在我的国家,政府工作人员会打印电子邮件,放在复印机上,然后再次扫描,以便复制。对他们的灵魂怜悯吧。;) - anon
4个回答

13

我所做的是使用 --global 标志安装 cabal。这将在 /usr/local/bin/cabal 中安装 cabal,因此它将始终替代 Debian 包中的 cabal。

另一种方法是通常避免使用 Debian 包并直接从源代码安装 Haskell 平台。如果您总是想要最新版本的 Haskell 库,则此方法也更好。


1
这很有趣。所以我为了使它工作,做了以下操作:> su > cabal update > cabal install cabal-install --global > exit > (在这里我从我的.bashrc文件中删除了别名,并重新打开了终端),现在它运行得很好!谢谢。 - Ptival
不会的。它不会安装任何东西到 /usr/local/lib。 - anon
@Evi1M4chine 这个答案可能已经过时了,很遗憾我不再使用 Haskell 了。 - fuz

11
我将我的用户本地 $HOME/.cabal/bin 放在 PATH 的最前面。 我仅从发行包中安装 ghc6ghc6-profghc6-doccabal-install。我不使用发行版的 cabal-install 来执行其他任何操作,只用来引导新的 ~/.cabal。 剩下的所有内容都会使用 cabal install 进行安装,包括更新版的 cabal 本身。
当我想要使用更新的 GHC 时,我将其部署在 /usr/local/stow/ghc版本号 中,并使用 GNU stow 启用它(它会在 /usr/local 中添加符号链接,再次优先于我的 PATH)。当我想切换回发行版的 GHC 时,我只需运行 stow -D 删除所有符号链接即可。
我认为使用 cabal-dev 具有项目特定的 cabal 安装,可以避免由于 cabal 不时出现的破坏性依赖关系。
实际上,我根本不使用 Haskell Platform,因为我不需要全部并且发现单独安装库更容易。我不会安装发行版的库,因为并非所有库都可用或者正好是我所需要的版本;如果所有库都安装在同一位置(在我的情况下是 ~/.cabal),那么更容易控制冲突。我不使用 --global 安装任何内容,因为我认为这是错误的,而且很难回滚。

谢谢,这很有趣。如果我遇到任何问题或烦恼,我可能会转换到这个。 - Ptival

4
当然,这些信息会过时,但是在撰写本文时,Debian unstable和testing版本都已经有cabal-install 0.10.2。
通常,Haskell相关的Debian包适用于那些希望使用一组已知可以相互兼容的软件包的用户,也就是说,不会出现依赖问题,但代价是可能无法获得最新的和最好的软件包。这也包括cabal-install。我使用仓库中的cabal-install,只安装那些尚未为Debian打包的库。
免责声明:我是那些为Debian创建这些软件包的人之一。

好的,我明白你不能满足每个人的需求,也没有那么繁琐的替代方案。 - Ptival

1

在Ubuntu上,我也倾向于通过stow安装GHC,完全忽略系统包。

与jetxee的方法略有不同的是,我确实安装了Haskell平台(从源代码),将其与GHC stow目录一起打包。我想我应该称这些路径为/usr/local/stow/haskell-platform-VERSION,但我倾向于使用/usr/local/stow/ghc-VERSION


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接