VSCode Devcontainer über Shortcut starten
Wie öffnet man ein VSCode Projekt direkt in einem Devcontainer (innerhalb von WSL), ohne erst das Projekt zu öffnen und dann 'Reopen in Devcontainer' zu nutzen? Klar geht es über 'Open Recent', aber da sieht man nur die letzten Projekte und hat trotzdem die Wartezeit für das erste laden des 'leeren' VSCode.
code.exe hat einen --remote parameter. Die Syntax für devcontainer ist:
code.exe --remote dev-container+<hex json blob><linux pfad im devcontainer> <linux pfad im devcontainer>Der JSON blob nennt sich 'authority' und hat folgenden Inhalt:
{
"hostPath": "\\\\wsl.localhost\\<WSL Name>\\<pfad in WSL mit backslashes>",
"localDocker": false,
"configFile": {
"$mid": 1,
"path": "/<linux pfad in WSL>/.devcontainer/devcontainer.json",
"scheme": "vscode-fileHost"
}
}Den blob kann man sich mit dem Skript unten generieren, z.B.
python open_devcontainer.py Ubuntu-26.04 /home/me/my/workspaceoder direkt VSCode starten mit --exec.
MSYS_NO_PATHCONV=1 python open_devcontainer.py Ubuntu-22.04 /home/me/my/workspace --execIch nutze immer git bash / msys / mingw, und da ist es wichtig, dass hier nicht automatisch der 'linux' pfad in windows umgewandelt wird. Deswegen mit Umgebungsvariable MSYS_NO_PATHCONV=1. --show zeigt den JSON blob im Klartext. So kann man prüfen ob der Pfad in Ordnung ist.
open_devcontainer.py
#!/usr/bin/env python3
"""Generate the VS Code dev-container remote authority for a folder in WSL.
Usage: open_devcontainer.py <wsl-distro> <path-in-wsl> [--exe PATH] [--exec] [--show]
Example: open_devcontainer.py Ubuntu-22.04 /home/dseemer/clones/lzb_ocie2_sim
"""
import argparse
import json
import os
import posixpath
import subprocess
def build_authority(distro: str, wsl_path: str, show=False) -> tuple[str, str]:
wsl_path = posixpath.normpath(wsl_path)
host_path = "\\\\wsl.localhost\\" + distro + wsl_path.replace("/", "\\")
payload = {
"hostPath": host_path,
"localDocker": False,
"configFile": {
"$mid": 1,
"path": posixpath.join(wsl_path, ".devcontainer/devcontainer.json"),
"scheme": "vscode-fileHost",
},
}
if show:
print(json.dumps(payload, indent=2))
# Compact separators: key order and formatting must match VS Code's output.
hex_id = json.dumps(payload, separators=(",", ":")).encode("utf-8").hex()
container_folder = "/workspaces/" + posixpath.basename(wsl_path)
return "dev-container+" + hex_id, container_folder
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("distro")
parser.add_argument("path")
parser.add_argument("--show", action="store_true")
parser.add_argument("--exe", default=r"C:\Program Files\Microsoft VS Code\Code.exe")
parser.add_argument("--exec", action="store_true", help="start VS Code instead of only printing the command")
args = parser.parse_args()
authority, folder = build_authority(args.distro, args.path, args.show)
if not args.show:
print(f'--remote {authority}{folder} {folder}')
if args.exec:
# env = dict(os.environ, MSYS_NO_PATHCONV="1")
subprocess.Popen([args.exe, "--remote", authority + folder, folder])
if __name__ == "__main__":
main()