我只是不明白。这太令人困惑了。
我知道有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
不删除包,对吗?因此,假设您安装了一个与其他软件包的最新版本中断的软件包。说单子控制。假设您这样做
cabal install foo --constraint 'monad-control < 1.0.0.0'
了,这使它起作用。稍后,您通过运行并从 .cabal/lib 和 package.conf.d 文件夹中物理删除相关文件来删除“foo”ghc-pkg unregister foo
(您真的必须手动执行此操作吗?)。然而,你现在仍然有旧版本的 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 年某个时候才会出现?