用 Node 脚本做 HarmonyOS 发布前静态自检:把项目约束写成代码
为什么已经有编译器还需要自检脚本ArkTS 编译器会检查语法和类型却不会知道你的产品约束Bundle ID 必须等于备案和市场后台中的值只允许一个设备认证权限中英日资源 Key 必须完全一致应用图标不能被小尺寸占位图替换本地优先 App 不应该突然加入网络权限统计页必须保留审核回归功能。这些规则如果只写在 README 中很容易在修改时被忽略。更可靠的方式是文档说明为什么 脚本检查有没有违反一、脚本不需要一开始就做成复杂工具项目使用普通 Node ESMimportfsfromnode:fs;importpathfromnode:path;constrootpath.resolve(newURL(..,import.meta.url).pathname);constreadJson(relative)JSON.parse(fs.readFileSync(path.join(root,relative),utf8));失败函数统一设置退出码constfail(message){console.error(FAIL:${message});process.exitCode1;};这样可以一次报告多个问题而不是遇到第一项就退出。二、检查 Bundle ID 和版本格式constappreadJson(AppScope/app.json5).app;constexpectedBundle你的稳定 Bundle ID;if(app.bundleName!expectedBundle){fail(bundleName must be${expectedBundle});}if(!Number.isInteger(app.versionCode)||app.versionCode0){fail(versionCode must be a positive integer);}if(!/^\d\.\d\.\d$/.test(app.versionName)){fail(versionName must use x.y.z format);}编译器允许很多合法字符串但团队可以定义更窄的版本规则。这里检查的是格式和固定身份。是否比上一个发布版本递增还需要读取发布记录、Git Tag 或 CI 参数。三、把允许权限做成白名单从模块配置读取constmoduleProfilereadJson(entry/src/main/module.json5).module;constpermissionsmoduleProfile.requestPermissions.map((item)item.name).sort();项目只允许设备认证constexpectedPermissions[ohos.permission.ACCESS_BIOMETRIC].sort();if(JSON.stringify(permissions)!JSON.stringify(expectedPermissions)){fail(unexpected permission set:${permissions.join(, )});}白名单比“禁止几个高风险权限”更适合小型本地应用任何新权限都会让检查失败开发者必须同步更新代码、用途文案、隐私政策和测试清单。四、比较三种语言的资源 KeyletcanonicalEntryKeys[];for(constlocaleof[base,zh_CN,ja_JP]){conststringsreadJson(entry/src/main/resources/${locale}/element/string.json).string;constnamesstrings.map((item)item.name);if(newSet(names).size!names.length){fail(${locale}has duplicate string keys);}constsortedNamesnames.slice().sort();if(localebase){canonicalEntryKeyssortedNames;}elseif(JSON.stringify(sortedNames)!JSON.stringify(canonicalEntryKeys)){// 输出 missing 和 extra}}这个检查能捕获新增中文文案但漏英文/日文拼写错误导致某语言多出 Key同一个文件内重复定义删除功能时只删了一种语言。它不能检查翻译质量但至少保证资源结构完整。五、应用名称资源也要单独检查桌面应用名称位于 AppScope不是页面模块资源。for(constlocaleof[base,zh_CN,ja_JP]){constappStringsreadJson(AppScope/resources/${locale}/element/string.json).string;constnamesappStrings.map((item)item.name);if(!names.includes(app_name)){fail(${locale}AppScope is missing app_name);}}否则应用内已经是日文桌面名称却可能回退基础语言。六、用文件特征防止资源被占位符替换项目检查图标文件大小for(consticonof[AppScope/resources/base/media/app_icon.png,entry/src/main/resources/base/media/icon.png]){conststatfs.statSync(path.join(root,icon));if(stat.size10000){fail(${icon}looks like a placeholder);}}文件大小不是严格的视觉验证但可以捕获常见事故真实图标被一个很小的临时 PNG 覆盖。可以继续加强读取图片宽高检查必须为 1024×1024检查颜色模式检查不含透明通道生成发布素材总览供人工确认。七、扫描本地优先架构的明显回退项目不使用网络因此验证脚本检查for(constforbiddenof[ohos.permission.INTERNET,http.request(,ohos/axios]){if(indexSource.includes(forbidden)){fail(unexpected network capability:${forbidden});}}这是低成本保护但必须认识局限只能扫描列出的文件字符串可能出现误报无法识别所有间接依赖第三方包内部能力不一定出现在页面源码不是安全审计或依赖分析的替代品。随着项目变大可以改成遍历所有.ets/.ts/.json5再结合依赖清单和权限配置检查。八、为审核回归功能保留“哨兵”某些功能曾因重构丢失可以用简单字符串做哨兵for(constrequiredof[uiRevision,refreshUi(),this.named(completed_checkins),this.named(reflection_cards),this.named(summary),eligibleDayIds(habit: Habit)]){if(!indexSource.includes(required)){fail(review regression coverage is missing:${required});}}这种检查比真正的 UI 自动化测试弱但能快速发现大段功能被误删。命名或架构重构时哨兵也需要更新所以它更适合作为短期回归护栏而不是永久规范。九、不要让静态脚本读取或打印真实签名秘密发布检查经常需要确认“签名已配置”但脚本不应该把密码、密钥路径或证书内容输出到日志。正确检查目标可以是公共仓库不包含已知敏感字段发布环境中必要文件存在构建产物已经签名CI Secret 名称存在但不打印值日志中对路径和凭据做脱敏。可以增加敏感模式扫描但只输出文件和字段名称不输出匹配到的秘密正文。一旦秘密进入 Git 历史仅从当前文件删除还不够通常还需要轮换。十、JSON5 解析是一个隐藏细节示例使用JSON.parse()读取.json5前提是当前文件内容实际上符合严格 JSON没有注释、尾随逗号或未加引号的 Key。如果以后开始使用完整 JSON5 语法脚本会解析失败。可选方案团队约定这些配置保持严格 JSON 子集引入 JSON5 解析库复用构建工具提供的配置解析能力。文件扩展名不等于实际解析器能力这一点应该在脚本说明中写清楚。十一、如何接入日常流程本地执行nodescripts/validate_project.mjs建议放在修改资源后 → 静态自检 → ArkTS 编译 → HAP/APP 构建 → 真机/模拟器回归如果使用 CI可以把脚本作为构建前置步骤。退出码非 0 时停止后续发布。但不要因为脚本通过就跳过人工审核。它适合检查确定性约束不适合判断截图是否好看、翻译是否自然、隐私文案是否准确。十二、适合继续增加的检查项版本号与上次发布记录比较三语言格式化占位符一致隐私政策 URL 使用 HTTPS 且可访问所有公开 URL 不指向测试域名设备类型与 QA 覆盖矩阵匹配HAP/APP 产物存在且时间为本次构建图标尺寸和 Alpha 通道Markdown 发布文档不含敏感信息签名配置未进入公共变更集导出结构版本与代码常量一致。总结一个几十行的自检脚本可以承担四类职责应用身份Bundle ID 和版本合规边界权限与网络能力资源完整性多语言和图标回归哨兵关键功能没有被误删。它的价值不在于替代编译器和测试而是把项目独有的约束变成每次都能重复执行的检查。本文案例来自“心晴手记MoodMemoir”HarmonyOS 项目的validate_project.mjs。参考资料HarmonyOS 应用开发知识地图

相关新闻

哪个电商 AI 作图工具最好用?零基础商家怎么选

哪个电商 AI 作图工具最好用?零基础商家怎么选

不少新手商家直接用 Midjourney、Stable Diffusion 这类通用 AI 绘画做商品主图,最后遇到三大痛点:商品本体失真:产品结构扭曲、LOGO 乱码、材质错乱,大量图片需要 PS 二次修复;使用门槛高:需要学习专业提示…

2026/8/26 7:56:35 阅读更多 →
Python学习日记8

Python学习日记8

开箱即用——模块与标准库10.1 模块的基本概念10.1.1 什么是模块模块(Module) 就是一个 .py 文件,包含 Python 代码。通过将代码组织成模块,可以实现:代码复用:一个模块可以被多个程序导入使用命名空间隔离…

2026/8/25 5:51:40 阅读更多 →
应届生想做 AI 应用开发,这些互联网公司值得优先考虑

应届生想做 AI 应用开发,这些互联网公司值得优先考虑

AI应用开发方向应届生求职:大厂、大模型创业、传统互联网AI转型怎么选?摘要:对于想入局AI应用开发的应届生,选工作本质是选择技术栈、业务场景与个人成长路径。本文梳理平台大厂、大模型创业公司、成熟互联网AI转型企业三类机会&a…

2026/8/25 5:51:40 阅读更多 →

最新新闻

YOLO自行车检测数据集实战:VOC格式转换与训练全流程

YOLO自行车检测数据集实战:VOC格式转换与训练全流程

简介:目标检测是计算机视觉的核心任务之一,YOLO作为主流检测框架,以其高效和易用性被广泛采用。在模型训练前,数据准备与格式转换是决定项目成败的关键环节。PASCAL VOC是经典的检测数据集,其标注为XML格式&#xff0c…

2026/8/26 7:56:41 阅读更多 →
挖掘机检测数据集实战:COCO JSON标注与智慧工地应用

挖掘机检测数据集实战:COCO JSON标注与智慧工地应用

简介:目标检测是计算机视觉的核心任务之一,在智慧工地等垂直场景中,通用模型往往因缺乏领域数据而失效,而高质量数据集与合理的标注格式直接决定了模型性能的上限。COCO JSON作为主流标注规范,能够完整描述目标边界框、…

2026/8/26 7:56:41 阅读更多 →
Fuse语言:静态类型与函数式编程如何提升代码可维护性

Fuse语言:静态类型与函数式编程如何提升代码可维护性

如果你也是第一次在技术社区看到 Fuse 这个静态类型函数式编程语言项目的标题,可能会好奇:为什么又冒出一门新语言?这个疑问很正常。过去几年,类型系统的概念已经慢慢从学术圈走进日常开发,函数式风格也不再是少数人的…

2026/8/26 7:56:41 阅读更多 →
MATLAB效度分析实战:从数据清洗到结构效度验证

MATLAB效度分析实战:从数据清洗到结构效度验证

1. 效度分析不是“跑个函数就完事”:MATLAB里最容易被误解的数模基础环节 效度分析在数学建模中常被当作“交卷前补上的最后一道工序”——学生查几个指标、套个现成代码、截图贴进论文附录,就算完成。但我在带三届校赛、两届国赛队伍的过程中反复发现&a…

2026/8/26 7:55:40 阅读更多 →
技术面试核心考点解析:并发编程与分布式系统设计

技术面试核心考点解析:并发编程与分布式系统设计

1. 面试题解析的价值与准备策略 在技术岗位求职过程中,系统性地梳理和掌握目标企业的常见面试题,往往是突破重围的关键一步。以QDKTAI这类技术驱动型企业为例,其面试题设计通常具有鲜明的业务导向特征——既考察候选人的基础理论功底&#xf…

2026/8/26 7:55:40 阅读更多 →
四套家乡主题网页设计模板拆解:HTML+CSS+JavaScript实战

四套家乡主题网页设计模板拆解:HTML+CSS+JavaScript实战

简介:在网页设计与前端开发中,HTML负责内容结构,CSS控制视觉表现,JavaScript实现交互逻辑,三者协同构建现代网站。掌握Flex布局、CSS Grid等响应式排版技术,能显著提升页面在不同设备上的适配能力&#xff…

2026/8/26 7:55:40 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →