新闻详情

新闻详情

首页 / 资讯中心 / 详情

napi-rs 的 `napi artifacts` 命令:把 GitHub Actions 编译产物收编进 npm 包并准备发布

发布时间:2026/9/27 7:59:48来源:尧图网络
napi-rs 的 `napi artifacts` 命令:把 GitHub Actions 编译产物收编进 npm 包并准备发布
开发工具后端【免费下载链接】napi-rsA framework for building compiled Node.js add-ons in Rust via Node-API项目地址https://gitcode.com/gh_mirrors/na/napi-rs点击查看免费下载本文讲解 napi-rs CLI 中napi artifacts命令的完整用法与底层实现。该命令负责把 CIGitHub Actions上跨平台构建产生的.node/.wasm编译产物按照目标平台归档进对应的 npm 子包目录并同步生成浏览器入口、类型声明等配套文件让产物“开箱即可发布”。读完本文你将掌握该命令的全部命令行参数、编程式 API 调用方式以及其目标核对、WASI 特殊处理、原子化文件写入等内部机制。命令定位连接“构建”与“发布”的中间环节在 napi-rs 的项目发布流程中一条典型流水线是先用napi build在 CI 的多个 runner 上分别编译出各平台的二进制然后由napi artifacts把所有 runner 上传的产物汇总到本地最后用napi prepublish兼容旧名napi prePublish或npm publish完成发布。artifacts命令正是负责“汇总与归档”这一步——官方命令描述为Copy artifacts from Github Actions into npm packages and ready to publish即把来自 GitHub Actions 的构建产物复制进 npm 包目录使其处于可发布状态。该命令的定义由代码生成器维护声明于 cli/codegen/commands.ts 中的ARTIFACTS_OPTIONS对应的帮助文档由 cli/codegen 自动生成即本文所依据的 cli/docs/artifacts.md文件头部标注“Do not edit this file manually”而命令的实际行为实现在 cli/src/api/artifacts.ts 的collectArtifacts函数中。用法两种调用方式1. CLI 方式napi artifacts [--options]所有选项均为可选项不带任何参数时使用默认配置即可在标准布局./artifacts输出目录 npm子包目录 根目录package.json下完成归档。2. 编程式 APIimport { NapiCli } from napi-rs/cli new NapiCli().artifacts({ // options })编程式调用的参数接口ArtifactsOptions定义于 cli/src/def/artifacts.ts其applyDefaultArtifactsOptions会在用户未传参时填入默认值见同文件 cli/src/def/artifacts.ts。Options 全表与逐项详解OptionsCLI Optionstyperequireddefaultdescription--help,-hget helpcwd--cwdstringfalseprocess.cwd()The working directory of where napi command will be executed in, all other paths options are relative to this pathconfigPath--config-path,-cstringfalsePath tonapiconfig json filepackageJsonPath--package-json-pathstringfalsepackage.jsonPath topackage.jsonoutputDir--output-dir,-o,-dstringfalse./artifactsPath to the folder where all built.nodefiles put, same as--output-dirof build commandnpmDir--npm-dirstringfalsenpmPath to the folder where the npm packages putbuildOutputDir--build-output-dirstringfalsePath to the build output dir, only needed when targets contain a WASI target--cwd命令的工作目录其余所有路径选项都相对它解析。默认取process.cwd()。它同时参与“包边界”的判定——源码会在cwd与package.json所在目录之间确定一个可管理的文件系统边界防止命令误伤边界外的文件详见 cli/src/utils/misc.ts 的resolvePackageReconciliationPaths。--config-path,-c指向napi配置 JSON 文件的路径。配置中可以声明binaryName、targets、wasm等字段。例如仓库示例 examples/napi/package.json 中即以内嵌napi字段的方式配置了binaryName: example与targets: [wasm32-wasip1, wasm32-wasip1-threads]。若不指定则从packageJsonPath指向的package.json中读取内嵌的napi配置。--package-json-path默认package.json。命令从该文件读取name决定 npm 包名、main决定根入口候选以及内嵌的napi配置。--output-dir,-o,-d默认./artifacts。与napi build的--output-dir保持一致——即 CI 各平台 runner 把编译好的.node/.wasm文件放进的那个目录。命令会递归扫描该目录下的所有.node与.wasm文件自动跳过node_modules见 cli/src/api/artifacts.ts。--npm-dir默认npm。归档产物的目标目录其下会按platformArchABI如linux-x64-gnu、win32-x64-msvc、darwin-arm64、wasm32-wasi建立子目录每个子目录对应一个待发布的平台子包。--build-output-dir仅当targets中包含 WASI 目标时才需要。WASI 构建除了产出.wasm二进制外还会生成 loader 与 worker 等配套 JS 文件这些文件可能并不在--output-dir下而是由构建命令单独输出该参数用于指明它们的所在目录。若未指定命令会回退到在“产物文件所在目录”与cwd中查找见 cli/src/api/artifacts.ts 的候选目录逻辑。底层执行流程一次完整的归档是怎么发生的collectArtifactscli/src/api/artifacts.ts在拿到用户选项后依次执行以下关键步骤路径解析与边界确认通过resolvePackageReconciliationPaths规范化cwd、package.json与npmDir的绝对路径找出“可被命令管理的文件系统边界”防止写入或删除越过包边界。读取配置调用readNapiConfig解析出targets目标三元组列表、binaryName二进制基名、packageName与packageJson。递归收集产物collectNodeBinaries从outputDir递归收集所有.node/.wasm文件并按“产物身份”聚合。产物身份的命名规则在artifactNamecli/src/api/artifacts.ts中定义{binaryName}.{platformArchABI}.{extension}其中 WASI/WASM 平台扩展名为.wasm其余平台为.node。例如binaryName为example时linux x64 gnu 产物即example.linux-x64-gnu.nodeWASI 产物为example.wasm32-wasi.wasm。写入规划所有待写文件先以destination - {content, source}的形式收集进pendingWrites若同一目标被两个不同内容的源文件写入会直接报Conflicting artifacts target错误见addPendingWritecli/src/api/artifacts.ts。根入口处理addArtifactRootEntry会根据package.json的main字段或回退到index.js把 JS 根入口从产物目录复制到包根目录WASI 目标则通过 loader 首行内嵌的元数据WASI_ARTIFACT_METADATA_PREFIX确定托管根入口。原子化提交commitArtifactReconciliation先在系统临时目录创建 staging 区写入全部内容再通过文件系统事务一次性提交cli/src/api/artifacts.ts避免中途失败留下半成品状态。严格的目标核对防止发错包、漏包或重复artifacts命令内置了三层校验全部位于 cli/src/api/artifacts.ts重复身份校验rejectDuplicateArtifactIdentities第 898 行发现同一binaryName.platformArchABI.ext身份对应多个文件时直接报错并提示“确保合并后的 CI 产物中每个配置目标只有一个构建或收窄--output-dir”。这能拦截 CI 合并产物时因路径冲突导致的同目标多份二进制。未配置目标的产物校验若outputDir中存在不属于targets的产物同时也不是 universal 二进制的组成源抛出Artifacts were found for unconfigured targets。防止把某个平台意外构建的二进制一并发布。缺失目标校验若配置的某个目标没有对应产物抛出Missing artifacts for configured targets并同时清理该目标在packageRoot与npmDir下遗留的旧文件removeTargetDestinations避免发布一个“看起来完整但实际缺平台包”的版本。此外命令还会对比“本次将要写入的文件”与npmDir各子包目录、包根目录中已存在的受管文件把不再需要的陈旧文件清理掉collectStaleManagedDestinations第 737 行但outputDir中已存在的普通文件会被收集进protectedSourcePaths保护绝不会被误删第 111-113 行。WASI 目标的特殊处理当targets中包含wasm32-wasi系列目标时归档逻辑远比原生平台复杂loader 文件组每个 WASI flavor 需要一组配套文件由requiredWasiFilescli/src/api/artifacts.ts确定{binaryName}.{suffix}.cjs、{binaryName}.{suffix}.d.cts、{binaryName}.{suffix}-browser.js带线程的 flavor 额外需要wasi-worker.mjs与wasi-worker-browser.mjs非线程 flavor 则换成{binaryName}.{suffix}-deferred.js与-deferred.d.ts。loader 后缀规则wasiLoaderSuffixcli/src/utils/target.ts从platformArchABI去掉wasm32-前缀得到后缀——例如wasm32-wasi得到wasi历史遗留命名wasm32-wasip1得到wasip1因此对应的 loader 文件名分别为example.wasi.cjs与example.wasip1.cjs。源码完整性校验findWasiArtifactSource会在候选目录--build-output-dir→ 产物目录 /cwd中寻找“完整的一组 loader 文件”一旦某个候选目录包含部分文件却又不完整立即报Incomplete artifact source found防止把旧版本地输出与新版 CI 产物混在一起第 353-393 行。浏览器入口重写复制-browser.js时会把其中的new URL(./wasi-worker-browser.mjs, import.meta.url)改写为指向实际发布包名{packageName}-{platformArchABI}/wasi-worker-browser.mjs保证浏览器端 worker 在发布后能正确解析第 254-263 行。这一行为有对应的单元测试验证见 cli/src/api/tests/artifacts.spec.ts测试在临时目录中构造 WASI 产物与buildOutputDir调用collectArtifacts({ cwd, buildOutputDir: build-output })后断言.wasm、loader、worker 及重写后的浏览器入口都正确落入npm/wasm32-wasi/目录。在 CI 中的典型组合用法artifacts通常不与build同机执行构建在各平台 runner 上并行完成并上传产物artifacts在发布机上汇总。一个典型流程是# 1. 在发布机上下载所有平台 runner 上传的产物到 ./artifacts # 2. 汇总归档到 npm/ 目录并核对目标完整性 napi artifacts # 3. 更新各平台子包版本号可选 napi version # 4. 更新 package.json 并准备发布 napi prepublish由于命令默认读取根目录package.json中内嵌的napi配置binaryName、targets无需在命令行重复声明目标列表归档目录结构完全由配置驱动。仓库中的 examples/napi/package.json 与 examples/napi-cargo-test 等示例项目均采用这种配置化布局可作为实际项目的参照。小结napi artifacts是 napi-rs 发布链路中“构建”与“发布”之间的枢纽它以package.json的napi配置为唯一事实来源把散落在./artifacts的跨平台二进制按binaryName.platformArchABI.ext命名规范归档进npm/平台子包同时完成 WASI loader 配套、浏览器入口重写、根入口同步、陈旧文件清理与三层目标完整性校验并以临时目录 staging 文件系统事务的方式原子化落地。理解其参数与内部校验逻辑可以帮助你在 CI 发布流水线中快速定位“缺平台包”“产物重复”“WASI 文件不全”等典型问题。赞分享开发工具后端【免费下载链接】napi-rsA framework for building compiled Node.js add-ons in Rust via Node-API项目地址https://gitcode.com/gh_mirrors/na/napi-rs点击查看免费下载相关推荐MediaPipe快速上手指南5分钟让设备端跑起人脸、手势与姿态检测MediaPipe快速上手指南5分钟让设备端跑起人脸、手势与姿态检测 你的应用需要实时的人脸检测、手势识别或姿态跟踪但又不想自己折腾模型部署MediaPi开发工具后端Mac鼠标优化终极指南让普通鼠标在macOS上获得触控板般流畅体验Mac鼠标优化终极指南让普通鼠标在macOS上获得触控板般流畅体验 还在为Mac上第三方鼠标的糟糕体验而烦恼吗Mac Mouse Fix是一款开源免费的 M桌面应用系统编程3分钟掌握IPTV播放源检查iptv-checker让你的电视直播永不掉线3分钟掌握IPTV播放源检查iptv checker让你的电视直播永不掉线 你是否经常遇到IPTV播放源突然失效需要手动更换频道的困扰iptv check后端任务调度音视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

架构决策记录(ADR)在大型分布式系统重构中的落地 2026/9/27 8:47:51

架构决策记录(ADR)在大型分布式系统重构中的落地

架构决策记录(ADR)在大型分布式系统重构中的落地在大型分布式系统演进的过程中,每一个接手遗留系统的研发人员都会经历这种时刻:看到一段极其诡异的代码逻辑或架构选型,去问老员工,老员工说“这是前年某某架…

阅读更多 →
AngularFire Cloud Messaging 实战指南:从 FCM 实例注册到服务端通知发送的完整实现 2026/9/27 8:47:50

AngularFire Cloud Messaging 实战指南:从 FCM 实例注册到服务端通知发送的完整实现

后端 【免费下载链接】angularfire Angular Firebase ❤️ 项目地址: https://gitcode.com/gh_mirrors/an/angularfire 点击查看 免费下载 Firebase Cloud Messaging(FCM)让你能为每台设备注册唯一的 FCM token(Firebase Insta…

阅读更多 →
微前端大仓中的跨技术栈微模块热重载:基于 Vite 与 ESM 的秒级极速 HMR 2026/9/27 8:47:50

微前端大仓中的跨技术栈微模块热重载:基于 Vite 与 ESM 的秒级极速 HMR

微前端大仓中的跨技术栈微模块热重载:基于 Vite 与 ESM 的秒级极速 HMR在大型微前端与 Monorepo 代码大仓的日常本地开发中,严重摧毁工程师“编码心流(Coding Flow)”的最主要元凶莫过于**“本地联调与模块热重载(HMR,…

阅读更多 →
Yao SUI 国际化(i18n)完整指南:翻译标记、语言包目录与 locale 检测机制 2026/9/27 8:47:42

Yao SUI 国际化(i18n)完整指南:翻译标记、语言包目录与 locale 检测机制

Agent 框架后端低代码RAG 【免费下载链接】yao ✨ All your agents and workspaces in one place, on every device you own. Track tasks on a board, accessible from desktop, mobile, browser, or API. Self-hosted. 项目地址: https://gitcode.com/gh_mirrors/…

阅读更多 →
深圳设计功能网站别乱选,源码下载后这3个坑能省2万 2026/9/27 8:47:35

深圳设计功能网站别乱选,源码下载后这3个坑能省2万

深圳设计功能网站别乱选,源码下载后这3个坑能省2万 备案流程一头雾水,是深圳很多中小企业建站时最容易卡壳的地方。很多人以为找个外包公司做网站,交钱就能万事大吉,结果最后卡在ICP备案上,或者网站上线后因为缺少源码,被服务商“卡脖子”。…

阅读更多 →
Penrose Style Collectors 深度指南:在 Style 语言中实现跨匹配聚合 2026/9/27 8:47:29

Penrose Style Collectors 深度指南:在 Style 语言中实现跨匹配聚合

开发工具数据可视化 【免费下载链接】penrose Create beautiful diagrams just by typing notation in plain text. 项目地址: https://gitcode.com/gh_mirrors/pe/penrose 点击查看 免费下载 Collectors(收集器)是 Penrose Style 语言中一类…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉