我只是不明白。这太令人困惑了。
我得到了ghc-pkg
,Cabal
和cabal-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年的某个时候才能看到光明?
答案 0 :(得分:2)
我肯定会建议安装Haskell平台。它可以是PITA进行更新(至少在Mac上),但它包含电池和许多你通常不会得到的软件包(例如,见System.Random
)。
ghc-pkg
通常用于列出已安装的软件包。
cabal
用于分发haskell包。在实践中,它用于构建可执行文件或安装库。您可以通过创建包含构建/安装可执行文件/库的配方的.cabal
文件来创建包。
cabal-install
是更新cabal
。
沙箱非常重要(它们只附带cabal
的最新版本。它们基本上类似于virtualenv
for python。通常它们会创建一个虚拟环境,您可以在其中安装所有库你想要的却不会污染全局系统范围的安装。要使用它们,你只需要进入你想要构建的项目的根目录并调用cabal sandbox init
然后就完成了。你可以继续使用{ {1}},cabal install
,cabal build
,cabal configure
,就像您通常所做的那样。它会自动检测到它在沙箱中。如果你搞砸了什么,你可以只需通过cabal test
删除沙箱。