VS Codeによるリモート開発
2019年5月2日 by The VS Code Team, @code
要約
本日、Visual Studio Codeの新しい3つの拡張機能のプレビューを発表できることを嬉しく思います。これらの拡張機能は、コンテナー内、物理マシンまたは仮想マシン上でのリモート開発、そしてWindows Subsystem for Linux (WSL)を利用したシームレスな開発を可能にします。Remote Development Extension Packをインストールすれば、すぐに始めることができます。
注: 現時点ではInsidersビルドを使用する必要がありますが、リモート開発のサポートは最終的にStable(安定版)リリースでも利用可能になる予定です。
ここに至るまでの経緯をご紹介します。
開発のトレンド
VS Codeの人気が高まるにつれて、私たちは、開発者の本当の悩みを解決するためにVS Codeをどう進化させるべきかを見極めるため、私たち自身とは大きく異なる多様な開発環境を持つ、ますます多くのユーザーと話をする特権と機会に恵まれました。
こうした会話の中で、興味深いパターンが浮かび上がってきました。多くの開発者が、特定の開発・実行スタックで構成されたコンテナーやリモートVMに対してVS Codeを使おうとしていたのです。その理由は単純で、これらの開発環境をローカルにセットアップすることが、あまりにも困難で、既存環境を破壊するリスクがあり、場合によっては不可能だからです。
私たちは皆、この問題を経験したことがあります。マシンを初期化する時期だと感じない限り :)、現在のうまく調整された環境を「台無しにする」恐れがあるため、Rust、Go、Node、Python 3といった新しいスタックを試すことをためらいます。
Python開発者はVS Codeに切り替えたいと思っていますが、特定のPythonスタック用に構成されたコンテナーや仮想マシンを開発環境として使用する必要があるため、それができません。
コードベースが非常に大きいため、Facebook(そしてMicrosoftも!)のような企業のエンジニアは、vimのようなエディターを使って、安全で強力な「開発者用VM」に対してリモートで作業しています。その際、最高のラップトップでさえ処理しきれない規模に対応できる、クラウドベースの代替検索・ナビゲーションサービスを利用しています。
データモデルを構築・トレーニングするデータサイエンティストは、大規模なデータセットを分析するために、高性能なデスクトップでさえ保存・処理できないような、巨大なストレージと計算サービスを必要とすることがよくあります。
Windows Subsystem for Linux (WSL)の人気が高まっている理由の一つは、ターゲットOSを含む、隔離された開発環境を簡単にセットアップできることにあります。実際、VS Codeリポジトリで3番目にコメントが多いissueは、Windows上のLinuxディストリビューションのBashターミナルからcode
を実行できるようにしてほしいというものです。
現在の解決策が抱える課題
これらの会話を通して、開発者がこの種の開発で直面する同じ課題を繰り返し耳にしました。
-
リモートデスクトップは機能しますが、一部のLinuxディストリビューションではセットアップが困難または不可能であり、開発体験は「ラグ」を感じることがあります。
-
SSHとVim(またはファイル同期機能付きのローカルツール)は機能しますが、動作が遅く、エラーが発生しやすく、一般的に最新の開発ツールが持つ生産性に欠けています。
-
ブラウザーベースのツールはさまざまなシナリオで役立ちますが、開発者はデスクトップツールが提供するリッチさや親しみやすさ、あるいは既存のローカルにインストールされたツールチェーンを諦めたくありません。
さらに悪いことに(私たちの意見では!)、開発者はこれらの環境で作業するために、IntelliSense(補完)、リンティング、デバッグといったVS Codeの中核となる体験を犠牲にしなければなりませんでした。
異なるアプローチ
これらの課題を聞いて、私たちはWSLのサポートを検討し始めました。当初は、VS Codeをインストールし、(当時は注意が必要でしたが!)通常通りWindowsのファイルシステムを編集するだけで、単純そうに見えました。私たちはNode.jsのリモートデバッグを有効にする作業を行い、bashシェルからcode
を起動できるようにする小さなスクリプトをインストールすればよいだろうと考えました。
しかし、それは正しくありませんでした。Node.jsのデバッグで行ったように、ランタイムごとに特別な対応をするのは理にかなっていません。もしWindowsにPython 2.7とFlaskがインストールされていて(あるいは全くインストールされていなくても)、LinuxディストリビューションにPython 3.7とDjangoがインストールされている場合、VS CodeはWindows側のバージョンを参照するため、適切な補完やリンティングが得られません。WindowsとLinuxの両方で開発環境を複製しなければならないのでは、WSLを持つ意味がありませんでした。
私たちは、VS Codeを2つの場所で同時に実行する方法が必要だと確信しました。つまり、開発者ツールをローカルで実行し、物理マシンや仮想マシン(例えばコンテナーやVM)のコンテキストでリモート実行されている一連の開発サービスに接続する方法です。これにより、リモート環境の内容に応じたリッチなローカル開発体験が得られます。
VS Code Remote Extensionsの紹介
過去数か月にわたり、私たちはコードの各レイヤー間の適切な境界を再設定し、ローカルの開発環境に関する前提を排除する作業に懸命に取り組んできました。そして、WSL、Dockerコンテナー、またはSSH経由の物理・仮想マシンで実行されるリモートワークスペースで作業するための、3つの新しい拡張機能を構築しました。
WSL拡張機能を使用すると、Windows Subsystem for Linux (WSL)を、VS Codeから直接、完全な開発環境として利用できます。この新しい最適化されたサポートにより、以下のことが可能になります。
- プラットフォーム固有のツールチェーンやユーティリティを使用して、Windows上でLinuxベースの環境で開発する。
- WSL内、またはマウントされたWindowsファイルシステム(例:
/mnt/c
)にあるファイルを編集する。 - LinuxベースのアプリケーションをWindows上で実行およびデバッグする。
コマンドや拡張機能はLinuxディストリビューション内で直接実行されるため、パスの問題、バイナリの互換性、その他のクロスOSの課題について心配する必要はありません。Windowsから操作するのと同じように、WSL内でVS Codeを使用できます。
WSLでの開発がいかに簡単か、この2分間の短い動画をご覧ください。
詳細については、WSLでの開発のドキュメントをご覧ください。
Remote - SSH拡張機能を使用すると、SSHサーバーが実行されている任意のリモートマシン、VM、またはコンテナー上でホストされているフォルダーやワークスペースを開くことができます。SSH経由での開発により、以下のことが可能になります。
- ローカルマシンよりも大規模、高速、またはより専門的なハードウェアで開発する。
- 異なるリモート開発環境間を素早く切り替え、ローカルマシンへの影響を心配することなく安全に更新を行う。
- 顧客サイトやクラウドなど、別の場所で実行されているアプリケーションをデバッグする。
例えば、深層学習プロジェクトに取り組んでいるとします。通常、大規模なデータセットでモデルをトレーニングするために必要なすべてのツールやフレームワークが構成された、GPUを多用する仮想マシン(AzureのData Science Virtual Machineなど)が必要になります。
SSH経由のVimやJupyter Notebooksを使ってリモートのコードを編集することもできますが、その場合、ローカルの開発ツールが持つリッチな機能を諦めることになります。しかし、Remote - SSH拡張機能を使えば、単にVMに接続し、Pythonのような必要な拡張機能をインストールするだけで、IntelliSense(補完)、コードナビゲーション、デバッグといったVS Codeの優れた機能をすべて、まるでローカルで作業しているかのように活用できます。
SSH経由で仮想マシン上で開発することがいかに簡単か、この2分間の短い動画をご覧ください。
詳細については、SSHを使用した開発のドキュメントをご覧ください。
Dev Containers拡張機能を使用すると、Dockerコンテナーを開発コンテナーとして利用できます。コンテナーは以下の理由から、優れた開発環境となります。
- デプロイ先と同じオペレーティングシステム上で、一貫性があり、簡単に再現可能なツールチェーンを使用して開発できる。
- コンテナーは分離されているため、ローカルマシンに影響を与えることなく、異なる開発環境間を素早く切り替えることができる。
- 他の人が一貫した開発環境で簡単に開発、ビルド、テストできるため、プロジェクトへの貢献が容易になる。
devcontainer.json
ファイルを使用して、VS Codeに開発コンテナーの構成方法を指示できます。これには、使用するDockerfile
、開くポート、コンテナーにインストールする拡張機能などが含まれます。VS Codeがワークスペース内でdevcontainer.json
を見つけると、自動的に(必要に応じて)イメージをビルドし、コンテナーを起動して接続します。ファイルはコンテナーにマウントされるため、ファイルを開いて、完全なIntelliSense(補完)、コードナビゲーション、デバッグなどを利用して編集を開始できます。
開発コンテナーが実際に動作している様子を、この2分間の短い動画でご覧ください。
開発コンテナーに関する詳細については、コンテナー内での開発のドキュメント、および今日から使えるサンプルが含まれているvscode-remote-try-*リポジトリをご覧ください。
拡張機能の管理
リモートで開発する場合、VS Codeは拡張機能が公開する機能に基づいて、ローカルまたはリモートのどちらにインストールするかを推測しようとします。拡張機能は次の2つのカテゴリのいずれかに分類されます。
-
UI拡張機能はローカルにインストールされます。これらの拡張機能はUIのみをカスタマイズし、ワークスペース内のファイルにはアクセスしないため、完全にローカルマシン上で実行できます。ローカルにインストールされるため、作業しているワークスペースに関係なく、常に利用可能です。UI拡張機能の例としては、テーマ、スニペット、言語の文法、キーマップなどがあります。
-
ワークスペース拡張機能はリモートにインストールされます。これらはワークスペース内のファイルやフォルダーにアクセスして、編集、IntelliSense(補完)、定義へ移動、デバッグなどを提供します。これらの拡張機能はUIをカスタマイズすることもあります。これらの拡張機能は、リモートホストのファイルシステムやツールに完全にアクセスできるように、リモートで実行されます。
ほとんどの拡張機能は更新され、リモート環境で正しく動作しますが、動作しないものに遭遇した場合は、その拡張機能のリポジトリにissueを報告してください。
拡張機能の作成者の方へ
VS Code拡張機能を作成している方向けに、リモート環境を意識した新しい拡張機能APIを実装しました。例えば、ブラウザーウィンドウを読み込むためにopen
パッケージを使用する代わりに、拡張機能の作成者はvscode.env.openExternal
APIを使用する必要があります。これにより、ブラウザーはローカルで開かれます。同様に、新しいclipboard
クラスがあり、これは期待通りローカルのクリップボードに内容を配置します。
更新されたAPIドキュメントには、リモート環境で拡張機能を実行、テスト、デバッグする方法など、さらに多くの詳細が記載されています。
はじめに
ここまで読んでいただき、ありがとうございます!
Visual Studio Codeのリモート開発を始めるための3つの簡単なステップはこちらです。
-
Insidersビルドをインストールします。リモート開発がStable(安定版)で利用可能になるまでは、これが必要になります。Insidersビルドは、最新の機能やバグ修正を含んで毎日リリースされます。安定性が心配な方も、ご安心ください! 私たちはVS Codeの開発にInsidersビルドを使用しており、何か問題が発生した場合に備えてStable版と並行してインストールできます(その際はぜひお知らせください)。
-
Remote Development Extension Packを入手します。これはWSL、SSH、コンテナーのサポートをインストールし、最も簡単に始める方法です。すべてが必要でない場合は、個々の拡張機能をアンインストールできます。
-
ドキュメントを読みましょう。Dev Containerのサンプルを試してみてください。Pythonで開発している方(多くの方がそうでしょう!)は、Dan TaylorによるリモートPython開発に関するブログ記事をチェックしてみてください。
最後に、問題が発生した場合は、issueを報告してください。よくある質問への回答については、FAQをご覧ください。
ご意見をお聞かせください!
ハッピーコーディング、
@code チームより