菜单

发布

相关源文件

本文档介绍了软件包发布系统,该系统允许开发人员将软件包提交到 JSR(JavaScript Registry)。发布系统通过 deno publish 命令处理软件包验证、文件选择、身份验证和注册表提交。

有关软件包管理和依赖项解析的信息,请参阅软件包管理

配置要求

发布需要一个配置正确的 deno.json 文件,其中包含特定的元数据字段。配置定义了软件包标识、入口点和发布行为。

必需字段

字段描述示例
名称带作用域的软件包名称"@foo/bar"
版本语义化版本"1.0.0"
exports入口点"./mod.ts"{"./submodule": "./lib.ts"}
license许可证标识符或文件"MIT"

可选发布配置

deno.jsonpublish 对象可为发布过程提供额外控制。

发布工作流

来源:tests/integration/publish_tests.rs14-45 tests/specs/publish/missing_license/mod.out1-11

文件选择与打包

发布系统实现了复杂的选择文件逻辑,该逻辑尊重 .gitignore 文件、自定义包含/排除模式以及对常见目录的内置排除。

默认排除项

系统会自动排除

  • .git/ 目录
  • node_modules/ 目录
  • vendor/ 目录(当设置 vendor: true 时)
  • .gitignore 模式匹配的文件

自定义包含/排除逻辑

publish.includepublish.exclude 数组提供细粒度的控制。

  • include:白名单特定文件或模式
  • exclude:黑名单文件或模式,支持使用 ! 前缀进行否定

文件选择逻辑

来源:tests/integration/publish_tests.rs89-125 tests/integration/publish_tests.rs174-222 tests/integration/publish_tests.rs361-399

认证和安全

发布需要通过基于令牌的系统进行身份验证。令牌可以通过 --token 标志或环境变量提供。

令牌认证

Git 仓库验证

系统强制执行干净的 git 状态,以确保发布的软件包与提交的代码一致。

  • 发布前检查未提交的更改
  • 如果工作目录未干净(除非使用 --allow-dirty),则失败。
  • 仅在 Git 仓库内适用

身份验证流程

来源:tests/integration/publish_tests.rs402-450 tests/integration/publish_tests.rs453-476

验证过程

发布系统在上传软件包之前执行全面的验证,以确保质量和合规性。

许可证验证

软件包必须通过以下方式之一指定许可证:

  • deno.json 中的 license 字段
  • 软件包根目录中的 LICENSE 文件

类型检查

系统执行“慢类型”(slow types)分析,以确保公共 API 具有适当的 TypeScript 声明和高效的类型检查。

模块图分析

验证器分析模块依赖图以

  • 检测不可分析的动态导入
  • 确保所有导出都可访问
  • 验证 import map 的使用

验证管道

来源: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

来源和透明度

发布的软件包会生成来源记录,以实现供应链透明度。系统会创建不可变的日志,这些日志可以通过外部透明度服务进行验证。

来源特性

  • 用于软件包完整性的加密签名
  • 用于公开验证的透明度日志条目
  • 与 Sigstore 基础架构集成
  • 成功发布后自动生成来源

来源流程

来源:tests/integration/publish_tests.rs75-86 tests/testdata/publish/successful_provenance.out1-8

错误处理

发布系统提供详细的错误消息和诊断信息,以帮助开发人员解决问题。

常见错误场景

错误类型原因解决方案
许可证丢失没有 license 字段或文件deno.jsonLICENSE 文件中添加许可证
未提交的更改Git 工作目录未干净提交更改或使用 --allow-dirty
令牌无效身份验证失败验证令牌有效性
类型错误公共 API 中的慢类型修复 TypeScript 声明
导出丢失找不到入口点验证 exports 配置

诊断输出

系统提供结构化的诊断输出,包含:

  • 错误代码和描述
  • 文件位置和行号
  • 有用的解决方法提示
  • 文档链接

来源:tests/specs/publish/missing_license/mod.out4-10 tests/integration/publish_tests.rs427-438