本文档介绍了软件包发布系统,该系统允许开发人员将软件包提交到 JSR(JavaScript Registry)。发布系统通过 deno publish 命令处理软件包验证、文件选择、身份验证和注册表提交。
有关软件包管理和依赖项解析的信息,请参阅软件包管理。
发布需要一个配置正确的 deno.json 文件,其中包含特定的元数据字段。配置定义了软件包标识、入口点和发布行为。
| 字段 | 描述 | 示例 |
|---|---|---|
名称 | 带作用域的软件包名称 | "@foo/bar" |
版本 | 语义化版本 | "1.0.0" |
exports | 入口点 | "./mod.ts" 或 {"./submodule": "./lib.ts"} |
license | 许可证标识符或文件 | "MIT" |
deno.json 中 publish 对象可为发布过程提供额外控制。
发布工作流
来源:tests/integration/publish_tests.rs14-45 tests/specs/publish/missing_license/mod.out1-11
发布系统实现了复杂的选择文件逻辑,该逻辑尊重 .gitignore 文件、自定义包含/排除模式以及对常见目录的内置排除。
系统会自动排除
.git/ 目录node_modules/ 目录vendor/ 目录(当设置 vendor: true 时).gitignore 模式匹配的文件publish.include 和 publish.exclude 数组提供细粒度的控制。
include:白名单特定文件或模式exclude:黑名单文件或模式,支持使用 ! 前缀进行否定文件选择逻辑
来源:tests/integration/publish_tests.rs89-125 tests/integration/publish_tests.rs174-222 tests/integration/publish_tests.rs361-399
发布需要通过基于令牌的系统进行身份验证。令牌可以通过 --token 标志或环境变量提供。
系统强制执行干净的 git 状态,以确保发布的软件包与提交的代码一致。
--allow-dirty),则失败。身份验证流程
来源:tests/integration/publish_tests.rs402-450 tests/integration/publish_tests.rs453-476
发布系统在上传软件包之前执行全面的验证,以确保质量和合规性。
软件包必须通过以下方式之一指定许可证:
deno.json 中的 license 字段LICENSE 文件系统执行“慢类型”(slow types)分析,以确保公共 API 具有适当的 TypeScript 声明和高效的类型检查。
验证器分析模块依赖图以
验证管道
来源:tests/specs/publish/missing_license/mod.out1-11 tests/integration/publish_tests.rs47-72
deno publish 命令提供了几个用于控制发布过程的选项。
| 选项 | 描述 | 默认 |
|---|---|---|
--token | 认证令牌 | 必填 |
--dry-run | 验证而不上传 | false |
--allow-dirty | 跳过 git clean 检查 | false |
--log-level | 日志详细程度 | info |
来源:tests/integration/publish_tests.rs32-36 tests/integration/publish_tests.rs210-211
发布的软件包会生成来源记录,以实现供应链透明度。系统会创建不可变的日志,这些日志可以通过外部透明度服务进行验证。
来源流程
来源:tests/integration/publish_tests.rs75-86 tests/testdata/publish/successful_provenance.out1-8
发布系统提供详细的错误消息和诊断信息,以帮助开发人员解决问题。
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
| 许可证丢失 | 没有 license 字段或文件 | 在 deno.json 或 LICENSE 文件中添加许可证 |
| 未提交的更改 | Git 工作目录未干净 | 提交更改或使用 --allow-dirty |
| 令牌无效 | 身份验证失败 | 验证令牌有效性 |
| 类型错误 | 公共 API 中的慢类型 | 修复 TypeScript 声明 |
| 导出丢失 | 找不到入口点 | 验证 exports 配置 |
系统提供结构化的诊断输出,包含:
来源:tests/specs/publish/missing_license/mod.out4-10 tests/integration/publish_tests.rs427-438