Skip to main content
On this page

使用 deno.lock 锁定依赖

deno.lock 会将每个依赖固定到一个精确解析后的版本,并附带完整性 哈希,因此每台机器(以及你的 CI)运行的都是相同的代码。只要存在 deno.json(或 package.json),Deno 就会自动创建并 更新它;你只需要把它提交到仓库,并决定它何时可以变化。

deno.lock 记录什么 Jump to heading

添加一个依赖(例如 deno add npm:chalk)后,Deno 会把锁文件写到你的配置文件旁边:

deno.lock
{
  "version": "5",
  "specifiers": {
    "npm:chalk@^5.6.2": "5.6.2"
  },
  "npm": {
    "chalk@5.6.2": {
      "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="
    }
  },
  "workspace": {
    "dependencies": ["npm:chalk@^5.6.2"]
  }
}

配置中的每个 semver 范围都会映射到一个精确版本,而每个包都会得到一个哈希,Deno 会在每次安装时进行验证。将 deno.lock 提交到 git;在其他机器和 CI 中,deno ci 会 严格安装锁文件所指定的内容。

审查锁文件差异 Jump to heading

版本升级会表现为解析结果变化以及哈希变化:

   "specifiers": {
-    "npm:ms@2.1.2": "2.1.2"
+    "npm:ms@^2.1.3": "2.1.3"
   },
   "npm": {
-    "ms@2.1.2": {
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4Xqe..."
+    "ms@2.1.3": {
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU..."

新增依赖则会添加条目,包括其传递依赖, 列在 dependencies 下:

   "npm": {
+    "debug@4.4.3": {
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru...",
+      "dependencies": ["ms"]
+    },

锁文件差异中出现意料之外的新包,值得在审查时进一步关注。

为 CI 冻结锁文件 Jump to heading

默认情况下,锁文件是增量式的:新的依赖会被记录下来,不会报错。在 CI 中,通常希望相反:如果有任何内容尚未锁定,就直接失败:

deno.json
{
  "lock": {
    "frozen": true
  }
}

同样也可以通过 --frozen 标志临时启用。启用冻结锁文件后,任何会修改 deno.lock 的命令都会以错误退出,并显示它想要进行的更改:

>_
$ deno install
error: 锁文件已过期。请运行 `deno install --frozen=false`,或重新使用 `--frozen=false` 运行以更新它。
changes:
 4 | -    "npm:chalk@^5.6.2": "5.6.2"
 4 | +    "npm:chalk@^5.6.2": "5.6.2",
 5 | +    "npm:ms@^2.1.3": "2.1.3"

deno ci 封装了推荐的 CI 流程:它 要求存在 deno.lock,删除任何现有的 node_modules,严格根据 锁文件进行安装,并且在锁文件缺失或过期时会报错。

更新和重新生成 Jump to heading

要有意更新依赖,只需对一个命令关闭冻结:

>_
deno install --frozen=false

由于锁文件是增量式的,被移除依赖的条目可能会残留。 要从头重新生成它,删除后重新安装:

>_
rm deno.lock
deno install

自定义路径或禁用 Jump to heading

deno.json
{
  "lock": { "path": "deps.lock" }
}

"lock": false 设置为完全禁用锁文件(不建议用于 应用程序)。如需了解完整情况,包括基于锁文件构建的供应链实践,请参阅 完整性检查和锁文件

Did you find what you needed?

编辑此页面
Privacy policy