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


`code-server` 换用微软 VS Code 扩展商店，配置项是 `EXTENSIONS_GALLERY` 环境变量。`systemd --user` 的 override 这样写：

```ini
[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` 的话，直接执行：

```bash
systemctl --user edit code-server.service
```

把上面的内容填进去，然后重载并重启：

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

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

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

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

## 我踩到的两个坑

### I. `%` 要写成 `%%`

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

`systemd` 的 unit 会把 `%` 当 specifier 处理，直接写 `%7Bpublisher%7D` 的话，服务日志会报类似错误：

```text
Failed to resolve specifiers ... ignoring: Invalid slot
```

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

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

直接这样写：

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

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

所以要这样写：

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

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

## 额外说明

我跑的是用户服务，改的文件是：

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

不是系统级的 `code-server@.service`。

配置完重载重启，页面能正常打开，微软扩展商店也能正常用。


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/code-server-microsoft-marketplace/  

