Code-Server 使用微软 vs Code 扩展商店

最近折腾了一下 code-server 使用微软 VS Code 扩展商店,过程里踩了两个坑,记录一下。

systemd --user 的 override 要这样写:

[Service]
Environment='EXTENSIONS_GALLERY={"serviceUrl":"https://marketplace.visualstudio.com/_apis/public/gallery","itemUrl":"https://marketplace.visualstudio.com/items","resourceUrlTemplate":"https://%%7Bpublisher%%7D.vscode-unpkg.net/%%7Bpublisher%%7D/%%7Bname%%7D/%%7Bversion%%7D/%%7Bpath%%7D","controlUrl":"","recommendationsUrl":""}'

如果你的服务名也是用户服务的 code-server.service,那就执行:

systemctl --user edit code-server.service

把上面的内容填进去,然后重载并重启:

systemctl --user daemon-reload
systemctl --user restart code-server.service

可以用下面这条确认变量有没有正确注入:

systemctl --user show code-server.service -p Environment

正常情况下应该看到一整段合法 JSON,而不是被拆坏的内容。

我踩到的两个坑

I. % 需要写成 %%

resourceUrlTemplate 里有 %7B%7D 这种 URL 编码。

但在 systemd 的 unit 里,% 会被当成 specifier 处理。如果直接写 %7Bpublisher%7D,服务日志里会报类似错误:

Failed to resolve specifiers ... ignoring: Invalid slot

所以这里必须把 % 写成 %%

II. 整个值要再包一层引号

如果直接这样写:

Environment=EXTENSIONS_GALLERY={"serviceUrl":"..."}

systemd 实际传给进程的值会把 JSON 里的双引号吃掉,最后变成非法 JSON,code-server 直接 500。

所以要这样写:

Environment='EXTENSIONS_GALLERY={"serviceUrl":"..."}'

也就是把整个 KEY=VALUE 再用一层单引号包起来。

额外说明

我这里实际运行的是用户服务:

code-server.service

所以改的是:

~/.config/systemd/user/code-server.service.d/override.conf

不是系统级的 [email protected]

最后

这样配置后,我这边已经可以正常打开页面,也可以使用微软扩展商店。