リモート開発

English

SSH のホスト、WSL、コンテナへの接続は Zed のリモート開発の文書 を見る。この章は ForgeKairos が変えた点を書く。

同梱のリモートサーバー

ForgeKairos は、静的にリンクした (musl) Linux x86_64 用のリモートサーバーを同梱し、接続時に確認なしで 送り込む。ホストの glibc に依存しないので、VS Code のリモートサーバーが動かない古い Linux でも動く (Ubuntu 18.04 で確かめている)。WSL と Docker の接続も同じサーバーを使う。

リモートサーバーのファイルの名前は forgekairos-remote-server-*。ホストの古いファイルを掃除するときは ForgeKairos 自身のファイルだけを消し、公式の Zed のファイルは消さない。

1 ホストに 1 プロセス

1 つの ForgeKairos から同じホストへの接続は 1 つのサーバープロセスを共有し、プロジェクトはその中の セッションになる。セッションは最後の接続から 10 分で終わり、プロセスは最後のセッションから 60 秒で終わる。 起動時に、自分の残骸を消す: 無くなったセッションの古い状態、新しい 5 つより古いサーバーのログ、30 日使って いない言語サーバーの版。

再接続

ネットワークの切断やスリープの後は自動で再接続する: 約 3 分の間に最大 15 回試し、PC がスリープから戻ると すぐに接続を確かめる。切れた接続は約 45 秒以内に検知する。

接続の往復は少ない: ホストの環境を 1 回の SSH のコマンドで調べ、結果を覚えておく。

切断をまたいで生きるターミナル

Windows 以外の SSH のホストでは、リモートサーバーが各ターミナルのシェルを生かしておく (terminal.remote_persistence.enabled、既定でオン)。接続が切れても ForgeKairos を再起動しても、コマンドは 動き続ける。再接続すると、最近の出力 (4 MiB まで) を流し直し、ターミナルはそのまま続く。シェルは、タブを 閉じたとき、またはターミナルが繋がっていない状態が terminal.remote_persistence.detached_timeout_hours (24) 続いたときに終わる。

タスク、エージェントのシェル、WSL、Docker、Windows のホストでは使わない。

インターネットに出られないホスト

remote.relay_http_through_client (既定でオン) では、ホストのダウンロード (言語サーバー、node、拡張機能、 エージェント) を手元の PC 経由で行う。インターネットに出られないホストにも言語サーバーを入れられる。設定は 再接続なしで効く。

言語サーバーやフォーマッターが無いときは、通知から入れられる (dev_tools.suggest_missing)。リモートに 接続している間は、そのホストに入れる。

Linux のファイルの監視

Linux (手元とリモートのホスト) では、ユーザーの全プロセスの inotify の監視の合計が上限の 4 分の 1 に 収まる間だけ監視を足し、残りのフォルダーはポーリングで見る。ホストのビルドなどのツールが監視の上限に当たらないようにするためである。 ポーリングのフォルダーの変化は数秒遅れて見える。

ホストの古い git

Git の連携はホストの古い git でも動く。Git を見る。

追跡していないファイルの git status

とても大きなリポジトリでは、git.status_untracked_files を "normal" か "no" にすると git status が 軽くなる。SSH ではホストでも同じ値を使う。

ファイル転送

SSH のプロジェクトでは、ターミナルのファイル転送の手元の側をリモートのホストにでき、そのとき転送の コマンドはホストで動く。ターミナルのマクロとセッション を見る。