远程开发

远程开发允许您以思维的速度编写代码,即使您的代码库不在本地机器上。您在本地使用 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-shift-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 尚未支持作为远程服务器,但 Windows 可以用作连接到远程服务器的本地机器。

配置

远程服务器列表存储在您的设置文件 cmd-,|ctrl-, 中。您可以使用远程项目对话框 ctrl-cmd-shift-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/~,但我们不支持将密码写入您的设置文件。如果您反复连接到同一主机,则应配置基于密钥的身份验证。

Windows 上的远程开发 (SSH)

Windows 上的 Zed 支持 SSH 远程连接,并在需要时提示凭据。

如果遇到身份验证问题,请确认您的 SSH 密钥代理正在运行(例如,ssh-agent 或您的 Git 客户端代理)并且 ssh.exe 在 PATH 中。

Windows 上的 SSH 故障排除

当系统提示输入凭据时,请使用图形 askpass 对话框。如果它没有出现,请检查凭据管理器冲突以及您的终端是否阻止了 GUI 提示。

WSL 支持

Zed 在 Windows 上原生支持打开 WSL 中的文件夹。

在 WSL 中打开本地文件夹

要在 WSL 容器中打开本地文件夹,请使用 projects: open in wsl 操作并选择要打开的文件夹。系统将为您显示可用于打开文件夹的 WSL 发行版列表。

打开已在 WSL 中的文件夹

要打开已位于 WSL 容器中的文件夹,请使用 projects: open wsl 操作并选择 WSL 发行版。该发行版将被添加到 远程项目 窗口中,您将能够在其中打开文件夹。

端口转发

如果您希望能够从本地机器连接到远程服务器上的端口,您可以在设置文件中配置端口转发。这对于开发网站特别有用,这样您就可以在工作时在浏览器中加载网站。

{
  "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 issue 或在 Zed Discord 中的 #remoting-feedback 频道联系我们。

支持的 SSH 选项

在底层,Zed 调用 ssh 二进制文件连接到远程服务器。我们为每个项目创建一个 SSH 控制主站,然后使用它来多路复用 Zed 协议本身、您打开的任何终端以及您运行的任务的 SSH 连接。我们从您的 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 Discord 中的 #remoting-feedback 频道。