远程开发
远程开发使您能够以思维的速度进行编码,即使您的代码库不在您的本地机器上。您在本地使用 Zed,因此 UI 立即响应,但将繁重的计算卸载到开发服务器,以便您可以有效地工作。
概述
远程开发需要两台计算机:一台运行 Zed UI 的本地机器和一台运行 Zed 无头服务器的远程服务器。两者通过 SSH 进行通信,因此您需要能够从本地机器 SSH 到远程服务器才能使用此功能。
在您的本地机器上,Zed 运行其 UI,与语言模型通信,使用 Tree-sitter 解析和语法突出显示代码,并存储未保存的更改和最近的项目。源代码、语言服务器、任务和终端都在远程服务器上运行。
注意: 远程开发的原始版本通过 Zed 的服务器发送流量。从 Zed v0.157 开始,您无法再使用该模式。
设置
- 下载并安装最新的 Zed。您至少需要 Zed v0.159。
- 使用 ctrl-cmd-o|alt-ctrl-shift-o 打开“远程项目”对话框。
- 单击“连接新服务器”并输入用于 SSH 进入服务器的命令。有关您可以传递的选项,请参阅支持的 SSH 选项。
- 您的本地机器将尝试使用路径上的
ssh
二进制文件连接到远程服务器。假设连接成功,Zed 将在远程主机上下载服务器并启动它。 - Zed 服务器运行后,系统将提示您选择要在远程服务器上打开的路径。
注意: Zed 目前无法很好地处理打开非常大的目录(例如,可能包含 >100,000 个文件的
/
或~
)。我们正在努力改进这一点,但建议您暂时只打开特定的项目,或者非常大的单体仓库的子文件夹。
对于不需要任何 SSH 参数的简单情况,您可以运行 zed ssh://[<user>@]<host>[:<port>]/<path>
以直接打开远程文件夹/文件。如果您想热链接到 SSH 项目,请使用以下格式的链接:zed://ssh/[<user>@]<host>[:<port>]/<path>
。
支持的平台
远程机器必须能够运行 Zed 的服务器。以下平台应该有效,但请注意,我们尚未详尽地测试每个 Linux 发行版
- macOS Catalina 或更高版本(Intel 或 Apple Silicon)
- Linux(x86_64 或 arm64,我们尚不支持 32 位平台)
- 尚不支持 Windows。
配置
远程服务器的列表存储在您的设置文件中 cmd-,|ctrl-,。您可以使用“远程项目”对话框 ctrl-cmd-o|alt-ctrl-shift-o 编辑此列表,该对话框提供了一些稳健性 - 例如,它会检查是否可以建立连接,然后再将其写入设置文件。
{
"ssh_connections": [
{
"host": "192.168.1.10",
"projects": [{ "paths": ["~/code/zed/zed"] }]
}
]
}
Zed 会调用您路径上的 ssh
,因此它将继承您在 ~/.ssh/config
中为给定主机配置的任何配置。也就是说,如果您需要覆盖任何内容,则可以在每个连接上配置以下附加选项
{
"ssh_connections": [
{
"host": "192.168.1.10",
"projects": [{ "paths": ["~/code/zed/zed"] }],
// any argument to pass to the ssh master process
"args": ["-i", "~/.ssh/work_id_file"],
"port": 22, // defaults to 22
// defaults to your username on your local machine
"username": "me"
}
]
}
每个连接还有两个额外的 Zed 特定选项:upload_binary_over_ssh
和 nickname
{
"ssh_connections": [
{
"host": "192.168.1.10",
"projects": [{ "paths": ["~/code/zed/zed"] }],
// by default Zed will download the server binary from the internet on the remote.
// When this is true, it'll be downloaded to your laptop and uploaded over SSH.
// This is useful when your remote server has restricted internet access.
"upload_binary_over_ssh": true,
// Shown in the Zed UI to help distinguish multiple hosts.
"nickname": "lil-linux"
}
]
}
如果您使用命令行通过执行 zed ssh://192.168.1.10/~/.vimrc
打开与主机的连接,则会从您的设置文件中读取额外的选项,方法是查找与命令行上 URL 的主机/用户名/端口匹配的第一个连接。
此外,值得注意的是,虽然您可以在命令行 zed ssh://user:password@host/~
上传递密码,但我们不支持将密码写入您的设置文件。如果您反复连接到同一主机,则应配置基于密钥的身份验证。
端口转发
如果您希望能够从本地机器连接到远程服务器上的端口,则可以在设置文件中配置端口转发。这对于开发网站尤其有用,因此您可以在工作时在浏览器中加载该站点。
{
"ssh_connections": [
{
"host": "192.168.1.10",
"port_forwards": [{ "local_port": 8080, "remote_port": 80 }]
}
]
}
这将导致从您的本地机器到 localhost:8080
的请求转发到远程机器的 80 端口。在底层,这使用了 ssh 的 -L
参数。
默认情况下,这些端口绑定到 localhost,因此与您的开发机器位于同一网络中的其他计算机无法访问它们。您可以设置 local_host 以绑定到不同的接口,例如,0.0.0.0 将绑定到所有本地接口。
{
"ssh_connections": [
{
"host": "192.168.1.10",
"port_forwards": [
{
"local_port": 8080,
"remote_port": 80,
"local_host": "0.0.0.0"
}
]
}
]
}
这些端口也默认设置为远程主机上的 localhost
接口。如果您需要更改此设置,还可以设置远程主机
{
"ssh_connections": [
{
"host": "192.168.1.10",
"port_forwards": [
{
"local_port": 8080,
"remote_port": 80,
"remote_host": "docker-host"
}
]
}
]
}
Zed 设置
打开远程项目时,有三个相关的设置位置
- 本地 Zed 设置(在 macOS 上的
~/.zed/settings.json
或 Linux 上的~/.config/zed/settings.json
中)位于您的本地机器上。 - 服务器 Zed 设置(在远程服务器上的同一位置)。
- 项目设置(在项目的
.zed/settings.json
或.editorconfig
中)
本地 Zed 和服务器 Zed 都读取项目设置,但它们不知道彼此的主 settings.json
。
根据您要进行的设置类型,您应该使用哪个设置文件
- 项目设置应用于影响项目的事项:缩进设置、要使用的格式化程序/语言服务器等。
- 服务器设置应用于影响服务器的事项:语言服务器的路径等。
- 本地设置应用于影响 UI 的事项:字体大小等。
初始化远程服务器
提供 SSH 选项后,Zed 会调用本地机器上的 ssh
,以使用您提供的选项创建 ControlMaster 连接。
SSH 需要的任何提示都将显示在 UI 中,因此您可以验证主机密钥、键入密钥密码等。
建立主连接后,Zed 将检查远程服务器二进制文件是否存在于远程服务器上的 ~/.zed_server
中,并且其版本与您当前使用的 Zed 版本匹配。
如果它不存在或版本不匹配,Zed 将尝试下载最新版本。默认情况下,它将直接从 https://zed.rust-lang.net.cn
下载,但如果您在该服务器的设置中设置:{"upload_binary_over_ssh":true}
,它会将二进制文件下载到您的本地机器,然后将其上传到远程服务器。
如果您想自己维护服务器二进制文件,您可以这样做。您可以从 Github 下载我们预构建的版本,也可以使用 cargo build -p remote_server --release
构建自己的版本。如果这样做,您必须将其上传到服务器上的 ~/.zed_server/zed-remote-server-{RELEASE_CHANNEL}-{VERSION}
,例如 ~/.zed_server/zed-remote-server-stable-0.181.6
。该版本必须与您正在使用的 Zed 本身的版本完全匹配。
维护 SSH 连接
服务器初始化后。 Zed 将创建新的 SSH 连接(重用现有的 ControlMaster)来运行远程开发服务器。
每个连接都尝试在代理模式下运行开发服务器。如果守护程序未运行,此模式将启动它,如果它正在运行,则重新连接到它。这样,当您的连接断开并重新启动时,您可以继续工作而不会中断。
如果重新连接失败,则不会重新使用该守护程序。也就是说,默认情况下,未保存的更改会保存在本地,因此您不会丢失工作。您可以随时重新连接到项目,Zed 将恢复未保存的更改。
如果您在连接方面遇到问题,您应该能够在 Zed 日志 cmd-shift-p Open Log
中看到更多信息。如果您看到任何意外情况,请提交 GitHub 问题 或在 Zed Discord 的 #remoting-feedback 频道中联系我们。
支持的 SSH 选项
在底层,Zed 会调用 ssh
二进制文件来连接远程服务器。 我们为每个项目创建一个 SSH 控制主进程,然后使用它来复用 SSH 连接,用于 Zed 协议本身、您打开的任何终端和运行的任务。 我们从您的 SSH 配置文件中读取设置,但如果您想为 SSH 控制主进程指定其他选项,您可以配置 Zed 来设置它们。
在“连接新服务器”对话框中输入时,您可以使用 bash 风格的引号来传递包含空格的选项。 创建服务器后,它将被添加到您设置文件中的 "ssh_connections": []
数组中。 您可以直接编辑设置文件来更改 SSH 连接。
支持的选项
-p
/-l
- 这些选项等同于在主机字符串中传递端口和用户名。-L
/-R
用于端口转发-i
- 用于使用特定的密钥文件-o
- 用于设置自定义选项-J
/-w
- 用于代理 SSH 连接-F
用于指定ssh_config
文件- 还有...
-4
,-6
,-A
,-B
,-C
,-D
,-I
,-K
,-P
,-X
,-Y
,-a
,-b
,-c
,-i
,-k
,-l
,-m
,-o
,-p
,-w
,-x
,-y
请注意,我们故意禁用了一些选项(例如 -t
或 -T
),因为 Zed 会为您设置它们。
已知限制
- Zed 扩展目前在远程服务器上不受支持,因此需要扩展支持的语言无法工作。
- 您无法通过在远程终端中输入
zed
命令来打开文件。
反馈
请加入 Zed Discord 中的 #remoting-feedback 频道。