Skip to content

从源码构建 ​

English

发布包与容器镜像可以直接使用,一般不需要自行构建。修改了 pwikit 的代码,或需要发布包之外的平台时,按本文构建。

pwikit 由 Go 代码与一个用 Rust 编写的维基语法渲染器(ftml)组成。渲染器编译为静态库,由 Go 通过 cgo 链接。按准备的工具不同,有三种构建方式:

方式需要安装适合
只装 GoGo、C 编译器只修改 Go 代码
使用 DockerDocker不想在本机安装任何工具链
完整构建Go、C 编译器、Rust、Node.js 与 Yarn修改渲染器或网页界面,或制作发布包

所有方式都在仓库根目录中执行命令。

只装 Go ​

下载与源码对应版本的预编译渲染器库,然后编译:

sh
go run ./tools/ftmllib -url https://github.com/WikitTeam/ProjectWikit/releases/download/v1.0.0
CGO_ENABLED=1 go build -o pwikit ./cmd/pwikit

tools/ftmllib 下载适合本机的 libftml_capi.a,放入 ftml-capi/target/release/,并检查它与源码要求的接口版本是否一致。不一致时会报错,此时请下载与源码匹配的版本,或改用完整构建。

系统C 编译器
Linuxgcc 或 clang,例如 apt install build-essential
macOSXcode 命令行工具:xcode-select --install
WindowsMinGW-w64 的 gcc,例如通过 WinLibs 或 MSYS2 安装,并加入 PATH

这样编译出的 pwikit 不含网页界面的静态资源与内置 PostgreSQL:

  • 静态资源:运行时通过 -static-dir 指向构建好的 static/ 目录,或按完整构建一并编入。
  • PostgreSQL:通过 -database 使用自有数据库,或按完整构建编入内置 PostgreSQL。

使用 Docker ​

构建容器镜像:

sh
docker build -t pwikit --build-arg VERSION=v1.0.0-local .

只取出 Linux 可执行文件,不生成镜像:

sh
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

构建发布包,与发布时使用的是同一个程序:

sh
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/ 中已有的文件

也可以分步构建:

sh
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 工具链,并附加一个链接参数:

sh
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 以上的系统上运行:

sh
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 显示的版本号在编译时写入:

sh
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 显示构建所用的提交编号。这样的程序不会检查或安装新版本,见更新与回档。