第145章 在 Linux 上构建 Zed 编辑器
代码仓库
克隆 Zed 代码仓库。
依赖项
-
安装 rustup
-
安装必要的系统库:
sh
script/linux
如果想手动安装系统库,可在 script/linux 文件中找到所需软件包的清单。
从源码构建
安装完依赖项后,即可使用 Cargo 构建 Zed。
构建编辑器调试版本:
cargo run
运行测试:
cargo test --workspace
在 release 模式下,主要的用户界面是 cli 包。开发模式下可这样运行:
cargo run -p cli
安装开发版
可通过以下命令在本地机器上安装构建版本:
./script/install-linux
该命令以 release 模式构建 zed 和 cli,将二进制文件安装到 ~/.local/bin/zed,并把 .desktop 文件安装到 ~/.local/share。
Wayland & X11
Zed 同时支持 X11 和 Wayland。默认情况下,会在运行时自动选择能找到的窗口系统。若当前处于 Wayland 环境,想以 X11 模式运行,可设置环境变量 WAYLAND_DISPLAY=''。
Zed 打包须知
本章节面向负责打包 Zed 的发行版维护者。
技术要求
Zed 有两个主要二进制文件:
- 需要构建
crates/cli,并将其二进制文件以zed为名放入$PATH中。 - 需要构建
crates/zed,并将其放置于$PATH/to/cli/../../libexec/zed-editor。例如,若将 cli 放在~/.local/bin/zed,则 zed 应放在~/.local/libexec/zed-editor。由于部分 Linux 发行版(尤其是 Arch)不推荐使用libexec,也可将该二进制文件放在$PATH/to/cli/../../lib/zed/zed-editor(例如~/.local/lib/zed/zed-editor)。 - 如果你要提供
.desktop文件,可以在crates/zed/resources/zed.desktop.in中找到一个模板,并使用envsubst来填充所需的值。还应将此文件重命名为$APP_ID.desktop,以便该文件符合 FreeDesktop 标准。此外,还应将此 desktop 文件设置为可执行(chmod 755)。 - 你需要确保已安装必要的库。你可以通过在你的系统上检查已构建的二进制文件来获取当前列表。
- 完整的构建脚本示例请参见 script/bundle-linux。
- 你可以禁用 Zed 的自动更新,并为那些试图手动更新 Zed 的用户提供说明。你只需在构建(或运行)Zed 时设置环境变量
ZED_UPDATE_EXPLANATION即可。示例:ZED_UPDATE_EXPLANATION="Please use flatpak to update zed."。 - 请记得将
crates/zed/RELEASE_CHANNEL文件的内容更新为 'nightly'、'preview' 或 'stable',且不要包含换行符。这将促使 Zed 使用凭据管理器来记住用户的登录信息。
其他注意事项
Zed 迭代速度很快,而各发行版维护者往往面临不同的限制和优先级。以下内容阐述了当前的权衡:
- Zed 是一个高速发展的项目。我们通常每周发布 2-3 个版本,以解决已报告的问题并交付较大的变更。
- Linux 系统上可能存在其他几个名为
zed的二进制文件(1,2)。如果你希望因这些问题而重命名我们的 CLI 二进制文件,我们建议使用zedit、zeditor或zed-cli。 - Zed 会自动安装常见开发工具的版本,类似于 rustup/rbenv/pyenv。这种行为在这里进行了讨论。
- 用户可以在本地安装扩展,也可以从 zed-industries/extensions 安装。扩展可能会安装额外的工具(如语言服务器)。计划中的安全性改进可查看 这里。
- Zed 默认会连接多个在线服务(AI、遥测、协作)。用户可以通过 zed 设置禁用 AI 和遥测,也可以修改我们的默认设置文件。
- 由于上述原因,Zed 目前在沙箱环境中运行不佳,详见此讨论。
Flatpak
Zed 目前的 Flatpak 集成会在启动时退出沙箱,依赖 Flatpak 沙箱机制的工作流可能无法按预期运行。
本地构建并安装 Flatpak 包的步骤如下:
- 按照这里的说明为你的发行版安装 Flatpak。
- 运行
script/flatpak/deps脚本安装所需依赖。 - 运行
script/flatpak/bundle-flatpak。 - 安装完成后,打包好的文件位于
target/release/{app-id}.flatpak。
内存分析
heaptrack 非常适合诊断内存泄漏。安装方式:
$ sudo apt install heaptrack heaptrack-gui
$ cargo install cargo-heaptrack
然后构建并运行附加了性能分析器的 Zed:
$ cargo heaptrack -b zed
退出该 Zed 实例后,终端输出中会包含一条运行 heaptrack_interpret 的命令,用于将 *.raw.zst 分析数据转换为 *.zst 文件,再用 heaptrack_gui 打开查看。
Perf 记录
如何从运行中的 Zed 实例获取符号已解析的火焰图。当 Zed 占用大量 CPU 时使用此方法,对程序卡死无帮助。
问题发生时
-
查找 PID(进程 ID):
ps -eo size,pid,comm | grep zed | sort | head -n 1 | cut -d ' ' -f 2或者使用 htop/btop/top 等工具,找到zed-editor中内存占用最高的那个进程的 PID。 -
安装 perf: 在 Ubuntu(及其衍生版)上执行
sudo apt install linux-tools。 -
录制 Perf 数据: 运行
sudo perf record -g --call-graph dwarf -p <刚才找到的pid>,等待几秒钟采集数据,然后按 Ctrl+C。此时应已生成perf.data文件。--call-graph dwarf选项会记录每个采样函数的调用者,并通过保留在剥离后的 Release 二进制文件中的.eh_frame数据进行栈回溯;如果没有帧指针,普通的-g选项无法正常工作。 -
将输出文件所有权改为当前用户: 执行
sudo chown $USER:$USER perf.data -
获取构建信息: 重新运行 Zed,在命令面板中输入 {#action zed::About} 以获取确切的 commit 哈希值。
可将 perf.data 文件连同确切的 commit 哈希值一起发送给 Zed。
后续步骤
以下步骤可由 Zed 团队成员执行。
发布的 Linux 二进制文件已剥离符号,但每个版本未剥离的二进制文件都归档在 Sentry 中(由 script/bundle-linux 上传)。
请从 Sentry 项目的 Debug Files 页面下载(通过版本号或二进制文件的 build id 搜索),然后继续执行下面的 perf buildid-cache 步骤。
由于剥离操作保留了 build id,因此下载的未剥离二进制文件与用户的 perf.data 是匹配的。
或者,重新构建带有符号的二进制文件:
- 检出之前找到的 commit 并修改
Cargo.toml。 应用以下差异更改,然后执行 Release 构建。
[profile.release]
-debug = "limited"
+debug = "full"
-
将符号添加到 perf 数据库:
perf buildid-cache -v -a <release zed 二进制文件路径> -
从数据库解析符号:
perf inject -i perf.data -o perf_with_symbols.data -
安装 flamegraph:
cargo install cargo-flamegraph -
渲染火焰图:
flamegraph --perfdata perf_with_symbols.data
故障排除
Cargo 报错声称依赖项使用了不稳定特性
尝试运行 cargo clean 和 cargo build。