主要观点:在 Tom Sydney 关于“让 Haskell 可执行文件与 Nix 静态链接”的优秀文章之后,提出一种替代方法,认为大多数 Haskell 开发者无需使用 Nix 也可实现二进制文件静态链接,介绍使用 Musl 和 Alpine Linux 进行静态链接的方式。
关键信息:
- GHC/cabal 通常不知如何进行部分静态链接,需使用 Musl libc 及基于 Musl 的 Linux 发行版如 Alpine Linux 或 Void Linux musl,本文选 Alpine。
- GHCup 支持 Alpine Linux,可在其上安装 GHC,且构建静态二进制文件不一定要使用静态链接的 GHC。
- 需用可重现(-ish)的干净构建环境,可利用支持 Alpine Linux 容器的 docker。
- 用
cabal build
结合cabal list-bin
构建并创建静态二进制文件,也可通过-ghc-options='-optl-static'
替代。 - 若二进制文件依赖系统 C 库,需安装相应的
-dev
和有时需-static
包,可在[https://pkgs.alpinelinux.org/...]搜索。 - Github CI 中有使用 Alpine 构建静态发布二进制文件的示例。
重要细节: - 构建过程中先在 docker 容器中安装各种依赖,如
apk update
等,再安装 GHCup 并创建 dummy app 进行测试,最后检查二进制文件属性。 - 若依赖不在 Alpine 仓库中,需更多手动工作,可考虑 Void Linux 作为替代。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。