有人解释了Haskell包管理系统

时间:2014-12-28 07:36:37

标签: haskell cabal-install ghc-pkg

我只是不明白。这太令人困惑了。

我得到了ghc-pkgCabalcabal-install。这些都是不同的东西。

我被告知安装haskell-platform是一个坏主意,分别安装ghc和cabal-install会更好。我不知道为什么这是一个坏主意。

我发现可以使用cabal sandbox init在本地文件夹中创建沙箱。但我不知道如何在全球范围内管理包裹。

通过brew安装ghc和cabal-install之后,我的下一步应该是什么?如果我cabal update它会创建〜/ .cabal目录,可能会告诉我通过运行来升级cabal-install cabal install cabal-install。然后我将不得不删除使用brew安装的那个,并将.cabal/bin添加到$ PATH,因此cabal将指向更新的那个。所以这意味着现在如果我坐在主目录中运行cabal install ghc-mod它会在〜/ .cabal文件夹中安装库吗? 我的ghc-pkg list指向/usr/local/Cellar/ghc/7.8.3/lib/ghc-7.8.3/package.conf.d但我并非如此。 ghc-pkg list --user指向~/.ghc/x86_64-darwin-7.8.3/package.conf.d并且我也不喜欢,但也许这很好。 无论如何,初始化ghc-pkg的正确方法是什么?我应该运行ghc-pkg init --global | --user还是其他什么?

你们能告诉我管理全球依赖关系的正确方法吗?

  • package.conf.d和实际包位于不同文件夹中是否正常? ~/.ghc文件夹和~/.cabal文件夹的作用是什么?

  • 如何正确卸载软件包? ghc-pkg unregister不会删除包裹,对吗?

    所以,让我们说你安装了一个打破了最新版本的其他软件包的软件包。说monad-control。让我们说你做cabal install foo --constraint 'monad-control < 1.0.0.0',这样就可以了。之后你会删除&#34; foo&#34;通过运行ghc-pkg unregister foo并从.cabal / lib和package.conf.d文件夹中物理删除相关文件(你真的必须手动执行吗?)。然而你现在还有旧版monad-control。有没有办法找到并修剪未使用的包?

  • 如何检查过时的套餐?

  • 有没有办法将依赖关系视为树? ghc-pkg list为您提供了扁平的包列表。

  • 为什么ghc-pkg check会抛出一堆警告:

    Warning: haddock-interfaces: ~/.cabal/share/doc/x86_64-osx-ghc-7.8.3/haddock-api-2.15.0.1/html/haddock-api.haddock doesn't exist or isn't a file
    

    我知道你可以安全地忽略这些警告,但他们的意思是什么呢?

  • 最后,你们有没有觉得Haskell的包装系统有点糟糕?我知道没有人应该在没有实际学习的情况下批评一些事情,我很抱歉这样说。我是Haskell的新手,但我觉得Haskell的默认包管理充满了缺点。我想知道是否有更好的选择,我不知道? Haskell已经存在了很长一段时间,我听说过关于包管理的讨论不应该依赖于具体的包,而应该基于抽象,比如接口。想知道,如果我们很快就会有这种包装系统吗?或者说这只是理论上的学术修辞,直到2020年的某个时候才能看到光明?

1 个答案:

答案 0 :(得分:2)

我肯定会建议安装Haskell平台。它可以是PITA进行更新(至少在Mac上),但它包含电池和许多你通常不会得到的软件包(例如,见System.Random)。

ghc-pkg通常用于列出已安装的软件包。

cabal用于分发haskell包。在实践中,它用于构建可执行文件或安装库。您可以通过创建包含构建/安装可执行文件/库的配方的.cabal文件来创建包。

cabal-install是更新cabal

的软件包

沙箱非常重要(它们只附带cabal的最新版本。它们基本上类似于virtualenv for python。通常它们会创建一个虚拟环境,您可以在其中安装所有库你想要的却不会污染全局系统范围的安装。要使用它们,你只需要进入你想要构建的项目的根目录并调用cabal sandbox init然后就完成了。你可以继续使用{ {1}},cabal installcabal buildcabal configure,就像您通常所做的那样。它会自动检测到它在沙箱中。如果你搞砸了什么,你可以只需通过cabal test删除沙箱。