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 编码配置。

DarcsDarcs版本控制Haskell2026/10/27

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-1build12.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 命令详解》。