# 供应链安全

依赖安全不是一次扫描，而是从解析、安装、脚本执行到升级发布的连续控制。

## 可复现安装

Deno 2.8 起，`deno ci` 提供类似 `npm ci` 的严格安装：要求已有 `deno.lock`、清理旧 `node_modules`，并按 frozen lockfile 安装。

```bash
deno ci
deno ci --prod
deno test
```

日常开发用 `deno install`；CI 和生产构建用 `deno ci`。锁文件过期时在开发分支显式更新并评审 diff，不在 CI 自动修复。

## 漏洞与生命周期脚本

```bash
deno audit
deno audit --socket
deno audit --fix
deno approve-scripts
```

`deno audit --fix` 会修改 manifest 并重建锁文件，应作为需要代码评审的升级操作。Deno 默认不执行 npm `preinstall` / `postinstall`；确有需要时只批准具体包：

```bash
deno install --allow-scripts=npm:better-sqlite3
```

## 最小依赖年龄

Deno 2.9 默认跳过发布不足 24 小时的 npm 版本。项目可以把窗口调大：

```json title="deno.json"
{
  "minimumDependencyAge": "P3D"
}
```

```ini title=".npmrc"
min-release-age=3
trust-policy=no-downgrade
```

`trust-policy=no-downgrade` 用于阻止已锁定包从可信发布方式静默降级到更弱方式；当前默认关闭，应先评估依赖生态的 provenance 覆盖。

## Lockfile 与 vendor

锁文件固定版本和完整性，但远程源消失时仍无法离线构建；`vendor: true` 可以把源码物化进仓库。高保障环境同时提交 `deno.lock` 与 `vendor/`，CI 再使用 frozen 模式。

官方依据：[Supply chain management](https://docs.deno.com/runtime/packages/supply_chain/)、[`deno ci`](https://docs.deno.com/runtime/reference/cli/ci/)、[`deno audit`](https://docs.deno.com/runtime/reference/cli/audit/)。
