Ubuntu 22.04 安装 Darcs 2.18.5 指南
在 Ubuntu 22.04 上安装 Darcs 2.18.5 的双路线实测:apt 仓库版 2.14.5 与 GHC 9.6.6 + cabal-install 3.10.3.0 源码构建 2.18.5,含 libtinfo 链接失败、GHC 目录名、cabal 软链失效等排障实录、离线 deb 校验值与 Shell 补全/UTF-8 编码配置。
Ubuntu 22.04 安装 Darcs 2.18.5 指南
目标:在一台 Ubuntu 22.04 服务器上装出可用的 Darcs。本文实测两条路线:A. apt 官方仓库版(2.14.5),三分钟可用、版本旧;B. 源码构建最新稳定版 2.18.5(GHC 9.6.6 + cabal-install 3.10.3.0),约 12 分钟、版本新。两条路线都给完整回显、离线包与校验值,并附构建期排障实录。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(jammy) |
| 内核 | 7.0.0-38-generic |
| CPU / 内存 | 6 vCPU / 18 GiB |
| 执行用户 | root |
| 网络 | 访问 archive.ubuntu.com、downloads.haskell.org 正常;下载 GHC 时走代理 192.168.1.62:7897 |
| 实测日期 | 2026-10-27 |
二、路线选型
| 维度 | 路线 A:apt 仓库 | 路线 B:源码构建 |
|---|---|---|
| 版本 | 2.14.5-1build1 | 2.18.5 |
| 耗时 | 约 30 秒 | 约 12 分钟(6 vCPU,含下载) |
| 磁盘 | 23 169 KiB(deb 3.7 MB) | GHC 解压后约 1.5 GB + cabal store |
| 依赖 | libc/libcurl3-gnutls/libffi8/libgmp10/libtinfo6/zlib1g | 额外需要 libncurses-dev、gmp、zlib 开发库 |
| 补全脚本 | 自带 /usr/share/bash-completion/completions/darcs | 不自动安装,需手动放置 |
| 适用 | 只要能用、版本不敏感 | 需要 2.18 的命令与格式、或统一版本 |
结论:生产机优先 B(版本新、命令名与本文其余三篇一致);受限环境(无编译链、无外网)用 A 或离线 deb。Darcs 是纯 CLI,没有 systemd 服务需要托管,装完即用。
三、路线 A:apt 安装 2.14.5
3.1 安装
apt-get update
apt-get install -y darcs
实测回显(节选):
Setting up libcurl3-gnutls:amd64 (7.81.0-1ubuntu1.30) ...
Setting up darcs (2.14.5-1build1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
Processing triggers for ca-certificates (20260816ubuntu0.22.04.1) ...
3.2 验证与包信息
darcs --version
apt-cache policy darcs
dpkg -s darcs | grep -E 'Version|Installed-Size|Depends'
2.14.5 (release)
darcs:
Installed: 2.14.5-1build1
Candidate: 2.14.5-1build1
Version table:
*** 2.14.5-1build1 500
500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
100 /var/lib/dpkg/status
Installed-Size: 23169
Version: 2.14.5-1build1
Depends: libc6 (>= 2.34), libcurl3-gnutls (>= 7.19.1), libffi8 (>= 3.4), libgmp10, libtinfo6 (>= 6), zlib1g (>= 1:1.1.4)
包内文件(补全与 man 手册):
dpkg -L darcs | grep -E 'bin/|bash|completion|man'
/usr/bin/darcs
/usr/share/bash-completion
/usr/share/bash-completion/completions
/usr/share/bash-completion/completions/darcs
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/darcs.1.gz
3.3 离线 deb 与校验
mkdir -p /root/offline && cd /root/offline
apt-get download darcs
ls -lh *.deb && sha256sum *.deb
-rw-r--r-- 1 root root 3.7M Sep 15 2021 darcs_2.14.5-1build1_amd64.deb
6d8f4cf78761bde122422e87efbd4fb03ea9ecb46d75e54d5e480d9688098778 darcs_2.14.5-1build1_amd64.deb
离线机安装:
dpkg -i darcs_2.14.5-1build1_amd64.deb
若提示缺依赖,先在联网机用 apt-get install --download-only -o Dir::Cache::archives=/root/offline darcs 连同依赖一起下载,再整体拷入离线机 dpkg -i *.deb。
四、路线 B:源码构建 2.18.5(cabal)
Darcs 官方只提供源码安装渠道(cabal install darcs / stack install darcs / Nix),没有官方 Linux 二进制包。Ubuntu 22.04 自带的 haskell-stack 是 2.3.3(2019 年版),无法解析 2.18.5 所需的 GHC 9.6 快照,因此本文用 GHC bindist + cabal-install 静态二进制 手工搭工具链。
4.1 安装编译依赖
apt-get install -y curl build-essential libgmp-dev zlib1g-dev libncurses-dev ca-certificates
libncurses-dev 提供 libtinfo.so 软链,缺它会在链接阶段报 cannot find -ltinfo(见排障实录 1)。
4.2 安装 GHC 9.6.6
cd /opt
curl -O https://downloads.haskell.org/~ghc/9.6.6/ghc-9.6.6-x86_64-deb11-linux.tar.xz
tar xf ghc-9.6.6-x86_64-deb11-linux.tar.xz
cd ghc-9.6.6-x86_64-unknown-linux
./configure --prefix=/opt/ghc/9.6.6
make install
export PATH=/opt/ghc/9.6.6/bin:$PATH
校验值(查询/下载日期 2026-10-27):
a34bdfc1f65b000135d9c8eb12d69670026a64043a8b33ef5ba24b0f8e28d046 ghc-9.6.6-x86_64-deb11-linux.tar.xz
注意:deb11 bindist 的顶层目录名是 ghc-9.6.6-x86_64-unknown-linux,与压缩包文件名不同;脚本里按文件名 cd 会直接失败。
4.3 安装 cabal-install 3.10.3.0
cd /opt
curl -O https://downloads.haskell.org/~cabal/cabal-install-3.10.3.0/cabal-install-3.10.3.0-x86_64-linux-deb10.tar.xz
tar xf cabal-install-3.10.3.0-x86_64-linux-deb10.tar.xz -C /usr/local/bin
cabal --version
cabal-install version 3.10.3.0
compiled using version 3.10.3.0 of the Cabal library
1d7a7131402295b01f25be5373fde095a404c45f9b5a5508fb7474bb0d3d057a cabal-install-3.10.3.0-x86_64-linux-deb10.tar.xz
4.4 构建并安装 Darcs
cabal update
cabal install darcs-2.18.5 --installdir=/usr/local/bin --overwrite-policy=always
结尾回显:
Starting darcs-2.18.5 (all, legacy fallback)
Building darcs-2.18.5 (all, legacy fallback)
Installing darcs-2.18.5 (all, legacy fallback)
Completed darcs-2.18.5 (all, legacy fallback)
Symlinking 'darcs' to '/usr/local/bin/darcs'
验证:
which -a darcs
/usr/local/bin/darcs --version
/usr/local/bin/darcs
/usr/bin/darcs
/bin/darcs
2.18.5 (release)
PATH 中 /usr/local/bin 在 /usr/bin 之前,因此 darcs 默认走 2.18.5;apt 版本仍保留在 /usr/bin/darcs,需要旧版时用绝对路径即可。
4.5 构建产物注意点
cabal install 默认在 installdir 建软链而不是复制:
lrwxrwxrwx 1 root root 136 Oct 27 12:30 /usr/local/bin/darcs -> ../../../root/.local/state/cabal/store/ghc-9.6.6/darcs-2.18.5-.../bin/darcs
一旦清理 /root/.local/state/cabal,命令立刻失效。要得到独立可执行文件:
cp -L /usr/local/bin/darcs /usr/local/bin/darcs-2.18.5
mv /usr/local/bin/darcs-2.18.5 /usr/local/bin/darcs
实测二进制动态依赖仅 libc/libm/libz/libtinfo/libgmp:
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
五、Shell 补全
- apt 路线:
/usr/share/bash-completion/completions/darcs已就位,重新登录 shell 即生效。 - 源码路线:cabal 安装不带补全文件,Darcs 2.18.5 也没有
--bash-completion-script这类自生成选项:
darcs --bash-completion-script darcs
# No such command '--bash-completion-script'
可从 apt 包中取出补全脚本复用:
dpkg -L darcs | grep completions
cp /usr/share/bash-completion/completions/darcs /etc/bash_completion.d/darcs-2.18.5
source /etc/bash_completion.d/darcs-2.18.5
该脚本是 2.14 时代产物,对 2.18 新增的
optimize子命令补全不全,但record/pull/push/log等常用项正常。
六、终端编码
Darcs 依赖 locale 编码读写补丁名与作者。实测服务器默认 LANG= 为空时,中文补丁名落库即变成问号:
darcs record -a -m '添加中文说明'
darcs log --last 1
* ??????????????????
设好 UTF-8 再记录则正常:
export LANG=C.UTF-8 LC_ALL=C.UTF-8
darcs record -a -m '中文补丁名测试'
darcs log --last 1
* 中文补丁名测试
注意:locale 必须在 record 之前设置,事后改 locale 无法修复已写成问号的补丁元数据。
七、卸载与回滚
路线 A:
apt-get remove -y darcs
# 彻底清理(含配置):apt-get purge -y darcs
路线 B:
rm -f /usr/local/bin/darcs /etc/bash_completion.d/darcs-2.18.5
rm -rf /root/.local/state/cabal /root/.cabal /opt/ghc /opt/ghc-9.6.6-x86_64-unknown-linux
注意 ~/.darcs(用户偏好与缓存)和 ~/.cache/darcs(全局缓存)不会随卸载删除,按需保留或清理。
八、排障实录
1)链接失败:/usr/bin/ld.gold: error: cannot find -ltinfo
[245 of 245] Compiling Darcs.UI.Commands.Help ( src/Darcs/UI/Commands/Help.hs, dist/build/Darcs/UI/Commands/Help.o, ... )
/usr/bin/ld.gold: error: cannot find -ltinfo
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
Error: cabal: Failed to build darcs-2.18.5.
原因:GHC bindist 自带库依赖 ncurses 的 libtinfo.so 开发软链,运行库 libtinfo6 不够。安装 libncurses-dev 后重跑 cabal install,已编译的 245 个依赖全部命中缓存,3 分钟完成链接与安装。
2)tar 解压后按文件名 cd 报目录不存在
GHC 压缩包名 ghc-9.6.6-x86_64-deb11-linux.tar.xz,解压目录却是 ghc-9.6.6-x86_64-unknown-linux/。安装脚本里写死文件名会中断;用 tar tf 先确认顶层目录,或 tar xf ... --strip-components=1 -C /opt/ghc-src。
3)/usr/local/bin/darcs 突然失效
原因是 cabal 的符号链接指向 ~/.local/state/cabal/store/...,清理 cabal store 或换用户后链接悬空。用 4.5 节的 cp -L 固化二进制。
4)中文补丁名变成问号
见第六节:LANG 为空时 Darcs 按 ASCII 转码,补丁名不可逆损坏。服务器上统一在 /etc/environment 写 LANG=C.UTF-8,或登录脚本里 export。
5)apt 与源码版本混淆
which -a darcs 有两条路径时,以 darcs --version 为准;脚本中需要固定版本就写绝对路径 /usr/local/bin/darcs,不要依赖 PATH。
九、验收清单
darcs --version # 2.18.5 (release)
darcs help | head -5 # 命令总览
mkdir /tmp/vtest && cd /tmp/vtest && darcs init .
darcs show repo # Format: hashed, darcs-2
四项全部通过即安装成功。下一步见 《Darcs 2.18.5 配置参数详解》 与 《Darcs 2.18.5 常用 CLI 命令详解》。