从源代码构建
本页介绍如何从源代码构建并运行 Antimatter,以便对其进行开发或制作自定义构建。内容涵盖位于同一代码仓库中的服务器和 Web 界面,随后介绍 Docker 镜像和应用。
所需条件
- Go,版本需与
server/go.mod中指定的一致(撰写本文时为 1.26.7)。 - Node.js 和 npm,版本需与
.nvmrc和webapp/package.json中指定的一致(Node 24.11.1 搭配 npm 11.6.2)。使用 mise 时,仓库中的mise.toml会安装正确的 Node 版本。 - 带有 Compose 的 Docker:开发环境会在容器中运行 PostgreSQL 及其他若干服务。
- make、git,以及一台 Linux 或 macOS 机器。
- 内存:构建 Web 界面是资源消耗最大的部分。建议预留 16 GB 内存;参见构建与内存。
git clone https://github.com/AntimatterChat/antimatter.git
cd antimatter
仓库将服务器存放在 server/,Web 界面存放在 webapp/(Fusion 位于 webapp/fusion,经典界面位于 webapp/channels,共享包位于 webapp/platform),端到端测试存放在 e2e-tests/。
运行开发服务器
cd server
make run
make run 会启动开发容器(PostgreSQL、Redis、邮件捕获工具和监控工具),将 Web 应用构建产物链接到指定位置,使用 go run 在后台启动服务器,并启动 Web 应用的监视器,以便在编辑时重新构建经典界面。打开 http://localhost:8065 并创建一个账户:第一个创建的账户将成为系统管理员。
命令(在 server/ 中) | 功能说明 |
|---|---|
make run-server, make run-client | 仅启动服务器,或仅启动 Web 应用监视器。 |
make restart-server | 在修改 Go 代码后重启服务器。 |
make stop | 停止服务器、监视器和容器。 |
make debug-server | 在 Delve 调试器下运行服务器。 |
make run-cli ARGS="-version" | 运行服务器命令。 |
make config-reset | 将 config/config.json 重置为默认值。 |
make clean, make nuke | 删除构建文件;nuke 还会删除开发数据。 |
开发数据库为 postgres://mmuser:mostest_password@localhost/mattermost_test,这是服务器的默认数据源。可通过 ENABLED_DOCKER_SERVICES 选择启动哪些容器,该变量可在 server/config.override.mk 文件或环境变量中设置(参见 server/config.mk)。
Web 界面
在 webapp/ 中:
npm install # also builds the shared packages
npm run build # the classic interface, then Fusion
构建产物位于 webapp/channels/dist(经典版)和 webapp/fusion/dist(Fusion)。在 server/ 目录下运行 make client 会将它们链接为 server/client 和 server/client-fusion,供服务器使用:经典版位于 /static/,Fusion 位于 /static/fusion/。
npm run run(或在webapp/目录下运行make run)会监视并重新构建经典界面。添加WATCH_FUSION=true可同时重新构建 Fusion。npm run dev-server(make dev)会运行 webpack 开发服务器:经典版使用端口 9005,Fusion 使用端口 9006。- 要在浏览器中查看其中一个界面,请在任意页面的地址后添加
?webui=fusion或?webui=classic。
测试与检查
| 命令 | 位置 | 功能说明 |
|---|---|---|
make test-server | server/ | 针对开发容器的服务器测试套件。耗时较长。 |
make test-server-quick | server/ | 仅运行简短测试。 |
go test ./channels/app/... -run TestName | server/ | 运行单个包或测试,需容器处于运行状态(make start-docker)。 |
make check-style | server/ | go vet、golangci-lint 及其他 Go 检查。 |
make test | webapp/ | Web 应用的单元测试(Jest),涵盖所有包。 |
npm run test -- <pattern> | webapp/fusion | Fusion 的部分测试。 |
make check-style, make check-types | webapp/ | ESLint 和 TypeScript。 |
make i18n-extract | server/ 和 webapp/ | 在添加或更改字符串后更新英文字符串文件(参见 翻译)。 |
请在 server/ 目录下运行 make modules-tidy,而不是 go mod tidy。
发布归档
cd webapp && npm run build && cd ..
cd server
make build-linux # the antimatter and amctl binaries
make package-linux # dist/antimatter-linux-amd64.tar.gz and -arm64
make build 可一次性构建 Web 界面和 Linux 二进制文件。归档中包含 bin/antimatter、bin/amctl、默认的 config/config.json(附带一份关于修改设置的 README.md)、两个 Web 界面、模板、字体和翻译文件。其他平台:make package-osx、make package-windows、make package-freebsd。
内置应用
普通的 make package-linux 会构建一个不包含应用的归档。若要像正式发布版本那样捆绑应用,请先获取已签名的应用包,并传入其所在文件夹:
build/package/fetch-apps.sh "$HOME/release-apps" # needs gh, python3 and gpg
make package-linux PREPACKAGED_PLUGINS_DIR="$HOME/release-apps"
fetch-apps.sh 会下载 antimatter-docker 的 plugins.json 中列出的每个应用的最新 GitHub 发布版本及其签名,并使用 Antimatter 的插件密钥验证签名。默认包含白板、语音频道、通话、智能体、待办事项、投票、笔记、GIF 和表情包;可通过 AM_BUNDLED_APPS(以空格分隔的仓库名称)更改列表。没有发布版本或没有签名的应用将被跳过并给出警告。这些包将放置在归档的 prepackaged_plugins/ 目录中。
.deb 和 .rpm 软件包
build/package/build-packages.sh <archive> <amd64|arm64> <version> <out-dir> 使用 nfpm 将发布归档转换为包含所有内容的 .deb 和 .rpm 软件包。管理员指南中介绍了它们安装的内容:请参阅安装 .deb 或 .rpm 软件包。
发布工作流
服务器仓库中的 antimatter-release.yml 工作流在 GitHub 上完成所有这些操作:当打上 v* 标签时,它会为 amd64 和 arm64 构建归档和软件包,附带 SHA256SUMS,并将其发布为该标签的 GitHub 发布版本(带有 - 的版本号将作为预发布版本)。手动运行时,它会将构建编号设为 0.9.0-dev.<run>,并将文件保留为工作流工件。每个应用仓库都有一个 release.yml 工作流,以相同方式发布其签名包。
Docker 镜像
antimatter-docker 仓库在 Docker 内部完全构建已发布的镜像,包括服务器及其应用:
git clone https://github.com/AntimatterChat/antimatter-docker.git
cd antimatter-docker
scripts/build-all.sh # from the main branches on GitHub
SOURCES=local scripts/build-all.sh # from your checkouts next to this folder
VARIANT=next scripts/build-all.sh # the "next" image, with every Antimatter app
需要支持 buildx 的 Docker、Python 3、git 和 gpg,约 16 GB 内存和 30 GB 磁盘空间。结果加载为 ghcr.io/antimatterchat/antimatter:dev;可使用 ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter:dev docker compose -f compose.local.yml up -d 进行尝试。plugins.json 列出了构建的应用及其版本,仓库的 README 解释了各种变体。
build-all.sh 会使用 Antimatter 签名密钥对捆绑的应用进行签名,而镜像构建会拒绝未签名的应用。如果没有该私钥(仅维护者持有),请单独运行前几个步骤:scripts/fetch-sources.sh、scripts/build-plugins.sh(应用包位于 out/plugins/)和 scripts/build-server.sh(服务器归档位于 out/server/)。构建与内存
Web 界面是大型 webpack 构建,内存不足是最常见的构建失败原因。
npm run build会依次构建经典界面和 Fusion,而不是同时构建,以降低峰值内存占用。请勿自行并行运行它们。- 压缩器会为每个处理器启动一个工作进程。在核心数多但内存少的机器上,请限制构建可见的处理器数量:
taskset -c 0-5 npm run build。 - 如果 Node 堆内存不足,请提高其限制:
NODE_OPTIONS=--max-old-space-size=6144。Docker 构建使用此值(build.env中的BUILD_NODE_OPTIONS)。 - 避免在小机器上同时运行服务器的完整测试套件、Web 构建和 Docker 构建。
应用
每个应用(插件)都有自己的仓库和 Makefile;make dist 用于构建其包。请参阅 构建、安装和调试。
桌面应用
桌面应用 是一个 Electron 应用。使用 Node.js 24 或更高版本:
npm install --allow-git=all
npm run build # development build, into dist/
npm start # run it
npm run package:linux # packages into release/ (also package:windows, package:mac)
构建时设置(例如预配置的服务器)位于 src/common/config/buildConfig.ts 中。如果没有 Apple 证书,请设置 AM_MAC_ADHOC_SIGN=true,以临时签名 macOS 应用(不进行公证):Apple 芯片的 Mac 会拒绝未签名的代码。该仓库的 release.yml 工作流会在 v* 标签上为 Linux、Windows 和 macOS 构建未签名的软件包。
移动应用
移动应用 是一个 React Native 应用;其 README 列出了相关命令(npm run ios、npm run android)。要构建自己的副本,您还需要自己的签名密钥、用于 Android 通知的 Firebase 项目、用于 iOS 的 APNs 密钥,以及一个持有这些凭据的推送代理。该仓库的 release.yml 工作流会在 v* 标签上构建 Android APK 和 AAB,以及未签名的 iOS .ipa,无需商店账号;其 README 列出了用于签名 Android 构建并配置 Firebase 的密钥。