从源码构建
发布包与容器镜像可以直接使用,一般不需要自行构建。修改了 pwikit 的代码,或需要发布包之外的平台时,按本文构建。
pwikit 由 Go 代码与一个用 Rust 编写的维基语法渲染器(ftml)组成。渲染器编译为静态库,由 Go 通过 cgo 链接。按准备的工具不同,有三种构建方式:
| 方式 | 需要安装 | 适合 |
|---|---|---|
| 只装 Go | Go、C 编译器 | 只修改 Go 代码 |
| 使用 Docker | Docker | 不想在本机安装任何工具链 |
| 完整构建 | Go、C 编译器、Rust、Node.js 与 Yarn | 修改渲染器或网页界面,或制作发布包 |
所有方式都在仓库根目录中执行命令。
只装 Go
下载与源码对应版本的预编译渲染器库,然后编译:
go run ./tools/ftmllib -url https://github.com/WikitTeam/ProjectWikit/releases/download/v1.0.0
CGO_ENABLED=1 go build -o pwikit ./cmd/pwikittools/ftmllib 下载适合本机的 libftml_capi.a,放入 ftml-capi/target/release/,并检查它与源码要求的接口版本是否一致。不一致时会报错,此时请下载与源码匹配的版本,或改用完整构建。
| 系统 | C 编译器 |
|---|---|
| Linux | gcc 或 clang,例如 apt install build-essential |
| macOS | Xcode 命令行工具:xcode-select --install |
| Windows | MinGW-w64 的 gcc,例如通过 WinLibs 或 MSYS2 安装,并加入 PATH |
这样编译出的 pwikit 不含网页界面的静态资源与内置 PostgreSQL:
- 静态资源:运行时通过
-static-dir指向构建好的static/目录,或按完整构建一并编入。 - PostgreSQL:通过
-database使用自有数据库,或按完整构建编入内置 PostgreSQL。
使用 Docker
构建容器镜像:
docker build -t pwikit --build-arg VERSION=v1.0.0-local .只取出 Linux 可执行文件,不生成镜像:
docker build --target binary --output dist .可执行文件写入 dist/pwikit。它在 Debian 12 环境中编译,需要 glibc 2.36 或更高版本,包含网页界面的静态资源,不含内置 PostgreSQL。
在 Windows 与 macOS 上,Docker 访问宿主机目录较慢,首次构建需要下载并编译全部依赖,耗时较长。之后的构建会复用 Docker 的构建缓存。
完整构建
需要安装:
- 与
go.mod中版本一致的 Go - C 编译器(见上文)
- Rust(通过 rustup 安装)。在 Windows 上还需要 GNU 工具链:
rustup toolchain install stable-x86_64-pc-windows-gnu - Node.js 20 与 Yarn
构建发布包,与发布时使用的是同一个程序:
go run ./tools/release build -version v1.0.0-local -out dist依次构建网页界面、渲染器库、内置 PostgreSQL 包,编译 pwikit 并打包,写入 dist/pwikit-<版本>-<系统>-<架构>.tar.gz(Windows 上为 .zip)。已经构建过的部分可以跳过:
| 参数 | 跳过的步骤 |
|---|---|
-skip-frontend | 构建网页界面,使用 static/ 中已有的文件 |
-skip-ftml | 构建渲染器库,使用 ftml-capi/target/release/ 中已有的文件 |
-skip-postgres | 下载内置 PostgreSQL,使用 internal/pgbundle/archive/ 中已有的文件 |
也可以分步构建:
cd frontend && yarn install --frozen-lockfile && yarn build && cd ..
cd ftml-capi && cargo build --release && cd ..
go run ./tools/pgarchive
CGO_ENABLED=1 go build -tags bundle -o pwikit ./cmd/pwikit在 Windows 上,编译渲染器库时请使用 GNU 工具链,并附加一个链接参数:
cd ftml-capi
RUSTFLAGS="-C link-arg=-ladvapi32" cargo +stable-x86_64-pc-windows-gnu build --release| 构建标签 | 编入的内容 |
|---|---|
| 无 | 只有 pwikit 本身 |
assets | 网页界面的静态资源 |
bundle | 网页界面的静态资源与内置 PostgreSQL |
nocgo | 不链接渲染器库。仅用于开发,页面无法渲染 |
在 Linux 上构建的发布包需要构建机器上的 glibc 版本或更高版本。发布时在 manylinux_2_28 容器中构建,使其可以在 glibc 2.28 以上的系统上运行:
cd frontend && yarn install --frozen-lockfile && yarn build && cd ..
docker run --rm -v "$PWD:/src" -w /src -e VERSION=v1.0.0-local quay.io/pypa/manylinux_2_28_x86_64 sh tools/release/linux.sh版本号
pwikit version 显示的版本号在编译时写入:
CGO_ENABLED=1 go build -tags bundle -ldflags "-X github.com/WikitTeam/ProjectWikit/internal/version.Release=v1.0.0-local" -o pwikit ./cmd/pwikit不写入版本号时,pwikit version 显示构建所用的提交编号。这样的程序不会检查或安装新版本,见更新与回档。
