Ubuntu 22.04 安装 TextQL 2.0.3 指南

在 Ubuntu 22.04.5 LTS 上经 apt 发行包(2.0.3-4build1)、go install 伪版本、master 源码构建三条途径安装 TextQL 2.0.3 的实测记录,含 -sqlfile 有无差异、版本串注入、GitHub 直连失败降级代理与 make test 失败排障

TextQLTextQLGoCLI工具2026/11/03

Ubuntu 22.04 安装 TextQL 2.0.3 指南

目标:在 Ubuntu 22.04.5 LTS 服务器上把 TextQL 2.0.3 装到可用状态。TextQL 的 GitHub release 停在 2015 年且不提供任何 Linux 二进制,但 Ubuntu universe 有发行包、Go 模块可直取 master、源码可自构建——本文实测三条安装途径(apt 发行包 / go install / 源码构建),讲清各途径产物在 -sqlfile 与版本串上的差异,并沉淀 GitHub 直连失败走代理降级、make test 失败绕行两个排障实录。以下所有命令与输出均为 Ubuntu 22.04(x86_64)实测回显。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(jammy),内核 7.0.0-38-generic,架构 x86_64,root 账号操作
  • 目标软件:TextQL 2.0.3(GitHub dinedal/textql;VERSION 文件值 2.0.3)
  • 三条途径产物对照(均为实测):
途径代码版本产物路径大小-sqlfile-version
A. apt 发行包2.0.3 release(2015 源码,Debian 2.0.3-4build1,2021-11 打包)/usr/bin/textql3,248,928 B❌ 无空行
B. go installmaster 伪版本 v0.0.0-20231022225140-e6545d501ca9/root/go/bin/textql7,690,800 B✅ 有空行
C. 源码构建(推荐)master e6545d5 + ldflags 注入 2.0.3/usr/local/bin/textql4,408,672 B✅ 有2.0.3

二、前置条件

途径 A 仅需网络可达 archive.ubuntu.com;途径 B/C 需要 Go 工具链(C 另需 gcc 与 git)。-console 功能另需系统 sqlite3。一次性装齐:

$ apt-get install -y golang-go gcc git sqlite3 curl

版本实测回显:

$ go version
go version go1.18.1 linux/amd64
$ gcc --version | head -1
gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
$ git --version
git version 2.34.1
$ sqlite3 --version
3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1

要点:官方 README 仅要求 Go ≥ 1.4,jammy 自带的 1.18.1 满足;依赖 mattn/go-sqlite3 走 CGO,没有 gcc 构建必败(见 9.6);go.mod 声明 go 1.13。

三、版本选型说明

TextQL 的版本现状(releases Atom 与仓库页,查询日期 2026-11-03):

  • release 序列止于 2.0.3:2.0.0(2015-10-09)→ 2.0.1/2.0.2(2015-12-15)→ 2.0.3(2015-12-17),且 release 页只有 Source code (zip/tar.gz) 资产,无预编译二进制;
  • master 最后提交 e6545d5(2023-10-22,PR #141 "read-sql-from-file" 新增 -sqlfile 参数);
  • Ubuntu universe 的 textql 包版本 2.0.3-4build1,基于 2015 年 release 源码打包(实测无 -sqlfile、版本串未注入)。

因此"装 2.0.3"有两条语义:保守(与发行包一致的 2015 代码,途径 A)或功能全(master 代码 + 2.0.3 版本串,途径 C,本文主线推荐)。若你的脚本要用 -sqlfile,必须走 B 或 C。

四、途径 A:apt 发行包安装(最省事,代码最旧)

4.1 方案说明

Ubuntu 22.04 的 universe 源直接提供 textql 包,apt 自动做 GPG 校验,零额外依赖,适合"只想快速有个 textql 用"的场景。

4.2 安装与验证

$ apt-get install -y textql
Fetched 1141 kB in 2s (711 kB/s)
Selecting previously unselected package textql.
(Reading database ... 28021 files and directories currently installed.)
Preparing to unpack .../textql_2.0.3-4build1_amd64.deb ...
Unpacking textql (2.0.3-4build1) ...
Setting up textql (2.0.3-4build1) ...
$ dpkg -l textql | tail -1
ii  textql         2.0.3-4build1 amd64        execute SQL against structured text like CSV or TSV
$ ls -la /usr/bin/textql
-rwxr-xr-x 1 root root 3248928 Nov 30  2021 /usr/bin/textql

4.3 该途径的功能边界(实测)

$ /usr/bin/textql -version | cat -A
$
$ /usr/bin/textql 2>&1 | grep -c sqlfile
0

⚠️ 注意:发行包两个硬伤——① -version 打印空行(Debian 构建未注入 VERSION);② usage 里 grep -c sqlfile 返回 0,即没有 -sqlfile 参数(2015 源码)。日常一次性查询够用;要用 SQL 文件驱动必须走途径 C。

4.4 systemd 托管说明

TextQL 是"跑完即退"的一次性 CLI,无常驻进程、无监听端口,不需要 systemd 单元;定时分析场景直接 crontab 调 textql -sql ... 即可。

五、途径 B:go install 安装 master 伪版本

5.1 方案说明

主包在模块的 /textql 子目录,安装命令须写到子包。2.0.3 的 tag(2015 年)早于 go.mod 引入,@latest 解析为 master 伪版本 v0.0.0-20231022225140-e6545d501ca9。模块下载走 Go 模块代理(默认 https://proxy.golang.org,direct),不需要 GitHub 直连,天然绕开第六章的直连问题;本服务器实测 proxy.golang.org 超时、切 goproxy.cn 成功(见 5.2)。

5.2 执行与产物验证(含模块代理降级实录)

$ go install github.com/dinedal/textql/textql@latest
go: github.com/dinedal/textql/textql@latest: module github.com/dinedal/textql/textql: Get "https://proxy.golang.org/github.com/dinedal/textql/textql/@v/list": dial tcp 142.251.34.209:443: i/o timeout

⚠️ 排障实录:本服务器默认 GOPROXY(proxy.golang.org)30 秒超时。换国内模块代理即时成功:

$ GOPROXY=https://goproxy.cn,direct go install github.com/dinedal/textql/textql@latest
# 实测 2.4 秒完成,仅 go-sqlite3 的 C 编译警告,无错误
$ ls -la /root/go/bin/textql
-rwxr-xr-x 1 root root 7690800 Nov  3 05:11 /root/go/bin/textql
$ go version -m /root/go/bin/textql | head -3
/root/go/bin/textql: go1.18.1
	path	github.com/dinedal/textql/textql
	mod	github.com/dinedal/textql	v0.0.0-20231022225140-e6545d501ca9	h1:Rf5A+wd86aNGFBD9SHmxfcZUcls2GgNUtBcSZ5FxvzM=
$ /root/go/bin/textql -version | cat -A
$
$ /root/go/bin/textql 2>&1 | grep -c sqlfile
1

⚠️ 注意:go install 不执行 Makefile 的 ldflags,产物 -version 是空行;但代码是 master(grep -c sqlfile 返回 1,含 -sqlfile)。要版本串可辨就走途径 C。

5.3 纳入 PATH

产物在 $HOME/go/bin,默认不在 PATH:

$ echo 'export PATH=$HOME/go/bin:$PATH' >> ~/.bashrc && source ~/.bashrc

六、途径 C:源码构建(推荐主线:-sqlfile + 2.0.3 版本串)

6.1 拉取源码(含网络降级实录)

$ mkdir -p /work && cd /work
$ timeout 200 git ls-remote https://github.com/dinedal/textql.git
error: RPC failed; curl 16 Error in the HTTP2 framing layer
fatal: expected flush after ref listing
$ echo $?
128

⚠️ 排障实录:本服务器 GitHub 直连不稳定——实测一次 33 秒后报 curl 16 Error in the HTTP2 framing layer(exit 128),另一次挂到 136 秒超时。常规机房直连 GitHub 通常正常,可先直接 clone;若同样失败,改走 HTTP 代理即时成功:

$ git -c http.proxy=http://192.168.1.72:7897 ls-remote https://github.com/dinedal/textql.git | head -3
e6545d501ca9c523110526e7b842d9301451e159	HEAD
48167d14826bbfde4623f245854548538721ae30	refs/heads/feature/v2
e483954a9177f4ecd77376717b03592b25ced7d0	refs/heads/gh-pages
$ git -c http.proxy=http://192.168.1.72:7897 clone https://github.com/dinedal/textql.git textql-src
Cloning into 'textql-src'...
$ cd textql-src && git log -1 --format="%h %ad %s" --date=short
e6545d5 2023-10-22 Merge pull request #141 from naoyafurudono/read-sql-from-file
$ cat VERSION
2.0.3

实测走代理 1.4 秒完成 clone(time 输出 real 0m1.385s)。

6.2 make test 失败实录与绕行

Makefile 的默认目标 textql 会先跑 go test ./...,实测该测试套件有一个断言与实现不符的失败用例:

$ go test ./... 2>&1 | tail -8
--- FAIL: TestCSVInputHasAName (0.00s)
    csv_test.go:140: Name() = csv3845608131, want ./csv3845608131
FAIL
FAIL	github.com/dinedal/textql/inputs	0.001s
?   	github.com/dinedal/textql/outputs	[no test files]
?   	github.com/dinedal/textql/sqlparser	[no test files]
ok  	github.com/dinedal/textql/sqlparser/sqltypes	(cached)
ok  	github.com/dinedal/textql/storage	(cached)
FAIL

⚠️ 排障实录:TestCSVInputHasAName 断言表名应带 ./ 前缀,而实现返回去前缀的基名——停更项目无人修,不影响构建产物(表名基名行为正是我们依赖的)。绕行:用 make fast(跳过 test)或直接 go build。

6.3 make fast 得到 2.0.3-dev

$ make fast
go build -i -ldflags "-X main.VERSION=`cat VERSION`-dev -s" -o ./build/textql ./textql/main.go
$ ./build/textql -version
2.0.3-dev

-dev 后缀来自 Makefile 硬编码。要正式版本串走下一步。

6.4 正式构建(ldflags 注入 2.0.3)

$ go build -ldflags "-X main.VERSION=2.0.3 -s" -o build/textql ./textql/main.go
$ ./build/textql -version
2.0.3
$ ls -la build/
total 4316
drwxr-xr-x  2 root root    4096 Nov  3 04:35 .
drwxr-xr-x 12 root root    4096 Nov  3 04:35 ..
-rwxr-xr-x 1 root root 4408672 Nov  3 04:35 textql

6.5 安装与验证

$ install -m 755 build/textql /usr/local/bin/textql
$ textql -version
2.0.3
$ ldd /usr/local/bin/textql
	linux-vdso.so.1 (0x0000779b1c2f8000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000779b1c0c4000)
	/lib64/ld-linux-x86-64.so.2 (0x0000779b1c2fa000)
$ textql -sql "count(*)" /root/textql-lab/sales.csv
11

ldd 显示仅依赖 glibc,SQLite 已 CGO 静态编入单二进制;冒烟查询正常(sales.csv 未带 -header,表头行也算数据,故 11)。

6.6 三途径并存与 PATH 遮蔽

三条途径的产物路径不同(/usr/bin、$HOME/go/bin、/usr/local/bin),同机并存时 textql 实际执行哪一个由 PATH 顺序决定:

$ which -a textql
/usr/local/bin/textql
/usr/bin/textql
/bin/textql

/usr/local/bin 在 /usr/bin 之前,故默认命中源码构建版。切换版本时记得 hash -r 刷新命令缓存。

七、其他分发渠道说明

官方 README 另列两渠道,均不适用 Ubuntu 22.04:macOS 用 Homebrew(brew install textql)、Arch 用 AUR(textql-git)。本文以服务器二进制安装为主线。

八、方案对比与选择建议

维度A. apt 发行包B. go installC. 源码构建
代码版本2015 release2023 master2023 master
-sqlfile无有有
-version 输出空行空行2.0.3
联网需求archive.ubuntu.comproxy.golang.orgGitHub(或代理)+ 模块缓存
额外依赖无Go 工具链Go + gcc(CGO) + git
产物/usr/bin/textql(3.2 MB)/root/go/bin/textql(7.7 MB)/usr/local/bin/textql(4.3 MB)
完整性校验apt GPG模块 h1 哈希无官方 checksum
升级/卸载apt remove重跑 go install / rm 单文件rm 单文件

解读:只想要个能用的 textql、不碰 -sqlfile → A(最快、有 GPG);要新功能且接受版本串为空 → B(免 clone,走模块代理天然规避 GitHub 直连问题);要"版本可辨 + 新功能 + 可控构建" → C(本文主线)。

九、配置说明

TextQL 没有配置文件:全部行为由 13 个命令行参数决定,不存在 .textql/config.json 或环境变量配置(源码级论证见《TextQL 2.0.3 配置参数详解》第二章)。两个可选外部件:

  • sqlite3(3.37.2 实测):仅 -console 需要;
  • libgo-sqlite3-extension-functions.so:安装后启动时自动加载(stdev/median 等扩展函数),不装则无。

十、常见问题

10.1 apt 装完为什么没有 -sqlfile?

发行包基于 2015 年 release 源码;-sqlfile 是 2023-10 master(PR #141)新增。走途径 B/C。

10.2 -version 打印空行?

VERSION 靠构建时 -ldflags "-X main.VERSION=..." 注入,apt 包与 go install 都未注入。途径 C 按 6.4 构建即可。

10.3 make 报 TestCSVInputHasAName FAIL?

已知测试断言与实现不符(6.2 实录),停更无人修。用 make fast 或直接 go build -ldflags ... 绕行,不影响产物。

10.4 git clone 卡住/报 HTTP2 framing error?

本服务器实测直连 GitHub 33 秒报 curl 16 Error in the HTTP2 framing layer、另次 136 秒超时;git -c http.proxy=http://192.168.1.72:7897 clone ... 秒级成功(6.1 实录)。长期方案:git config --global http.proxy http://192.168.1.72:7897。

10.5 go install 命令应该写到哪一层?

主包在模块子目录,命令必须写到 github.com/dinedal/textql/textql@latest(末尾 /textql);模块根路径下没有可执行包。

10.6 构建报 cgo: C compiler "gcc" not found?

mattn/go-sqlite3 走 CGO。apt-get install -y gcc 后重试。

10.7 -console 报 unable to locate sqlite3?

-console 会 fork 系统 sqlite3。apt-get install -y sqlite3 解决;纯查询场景不需要。

10.8 装完哪个版本生效?

which -a textql 看遮蔽顺序(6.6 实测),换版本后 hash -r。

10.9 go install 报 proxy.golang.org i/o timeout?

本服务器实测默认 GOPROXY 30 秒超时(dial tcp 142.251.34.209:443: i/o timeout)。GOPROXY=https://goproxy.cn,direct go install ... 实测 2.4 秒成功(5.2 实录);长期生效用 go env -w GOPROXY=https://goproxy.cn,direct。

十一、卸载与清理

三条途径产物逐一移除并验证(实测回显):

$ apt-get remove -y textql
Removing textql (2.0.3-4build1) ...
$ rm -f /usr/local/bin/textql /root/go/bin/textql
$ hash -r
$ which -a textql
(textql gone)
$ textql -version
bash: line 5: textql: command not found
$ echo $?
127

源码目录与测试数据按需清理:rm -rf /work/textql-src /root/textql-lab。

十二、参考链接