远程开发

远程开发使您能够以思维的速度进行编码,即使您的代码库不在您的本地机器上。您在本地使用 Zed,因此 UI 立即响应,但将繁重的计算卸载到开发服务器,以便您可以有效地工作。

概述

远程开发需要两台计算机:一台运行 Zed UI 的本地机器和一台运行 Zed 无头服务器的远程服务器。两者通过 SSH 进行通信,因此您需要能够从本地机器 SSH 到远程服务器才能使用此功能。

Architectural overview of Zed Remote Development

在您的本地机器上,Zed 运行其 UI,与语言模型通信,使用 Tree-sitter 解析和语法突出显示代码,并存储未保存的更改和最近的项目。源代码、语言服务器、任务和终端都在远程服务器上运行。

注意: 远程开发的原始版本通过 Zed 的服务器发送流量。从 Zed v0.157 开始,您无法再使用该模式。

设置

  1. 下载并安装最新的 Zed。您至少需要 Zed v0.159。
  2. 使用 ctrl-cmd-o|alt-ctrl-shift-o 打开“远程项目”对话框。
  3. 单击“连接新服务器”并输入用于 SSH 进入服务器的命令。有关您可以传递的选项,请参阅支持的 SSH 选项
  4. 您的本地机器将尝试使用路径上的 ssh 二进制文件连接到远程服务器。假设连接成功,Zed 将在远程主机上下载服务器并启动它。
  5. 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_sshnickname

{
  "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 频道。