为什么 Haskell-Stack 和 GHC 的全新安装如此 large/big?

Why is a fresh install of Haskell-Stack and GHC so large/big?

在全新安装 Haskell 时通过 here 中的安装脚本堆栈:

wget -qO- https://get.haskellstack.org/ | sh

其次是:

stack setup

您最终会得到一个 $HOME/.stack/ 大小为 1.5 GB 的目录(来自 120+ MB 的下载)。此外,如果您 运行:

stack update

大小增加到 2.5 GB。

我习惯了 Java,它通常被认为是 large/big(涵盖了几乎所有内容,并且为了向后兼容而弃用了替代方案),但作为比较:IDE 包括JDK,一个独立的 JDK,JDK 源文件的大小可能约为 1.5 GB。

另一方面,Haskell 是一种 "small beautiful" 语言(据我所知,这可能主要指的是语法和语义,但仍然如此)是large/big,我觉得很奇怪。

  1. 为什么这么大(跟这个question有关吗?)
  2. 这个尺寸是正常的还是我安装了额外的东西?
  3. 如果每样东西都有好几种(4 种?、5 种?)口味,那么我可以去掉除一种以外的所有口味吗?
  4. 是否有一些数据cache/temporary可以删除?
  5. 最大的目录是:.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2 (1.3 GB) 和 .stack/indices/Hackage (980 MB)。我假设第一个是已安装的包(与 stack setup 相关),而后者是 Hackage 包存档的一些索引(与 stack update 相关)?这些可以减少吗(如上 3 或在线获取所需的 Hackage 信息)?

正如您可能通过检查看到的那样,它是以下各项的组合:

  • GHC 的三种风格(静态、动态和分析)运行time(总共约 400 兆)和核心 GHC 库(总共 700 兆)加上 100 兆接口文件和另外 200 megs 的文档和 120 megs 的压缩源(总共 1.5 gig,都在 programs/x86_64-linux/ghc-8.2.2* 或类似的范围内)
  • 未压缩的 Hackage 索引 00-index.tar01-index.tar 的两个相同副本,每个副本包含 .cabal 文件,用于 Hackage 数据库中曾经发布的每个包的每个版本,每个大约 457 megs,再加上一些其他文件,使总数达到 1.0 gigs

当您 运行 stack setup 时安装第一个;第二个当你 运行 stack update.

回答您的问题:

  1. 它之所以如此之大,是因为显然没有人做出任何努力使其变小,整个 00-index.tar00-index.tar.gz01-index.tar 情况都证明了这一点。
  2. 这是最小安装的正常大小。
  3. 如果您不想使用分析来编译程序,您可以删除分析版本(*_p.a 文件)。我没有对此进行过广泛的测试,但它似乎有效。我想这将为您节省大约 800 兆。如果您 想要动态 link 程序(即使用 ghc -dynamic),您也可以删除静态版本(所有 *.a 文件)。同样,我还没有对此进行广泛的测试,但它似乎有效。删除动态版本将非常困难——您必须找到一种方法来仅删除 GHC 本身不需要的那些 *.so 文件,并且您删除的任何内容都将无法再在解释器中加载。
  4. 有几项已缓存,您可以将其删除。例如,您可以删除 00-index.tar00-index.tar.gz(节省大约 0.5 GB),Stack 似乎 运行 没问题。不过,它会在您下次 运行 stack update 时重新创建它们。我认为这在任何地方都没有记录,所以要确定可以安全删除的内容需要大量的试验和错误。
  5. 我想这个问题上面已经讲过了。

一个没什么的建议,前几天,我看到一些 3 TB 的驱动器很划算,我兴奋地订购了两个,然后才意识到我真的没有有什么可以穿的。它有点像几千兆字节,不是吗?

我想我不会花费很多精力尝试 trim 进入您的 .stack 目录,至少在功能强大的台式机上是这样。如果您使用的笔记本电脑的 SSD 相对较小,请考虑将 .stack 目录放在支持透明压缩的文件系统(例如 Btrfs)上,如果您认为它可能会失控的话。