chore(mp-harmony): 修正子包 HAR name 字段 + 纳入元数据到 git

背景:
  mp-harmony 项目的 5 个 ascf shared HAR 子包 (components_diy / pages_goods /
  pages_order / pages_promotion / pages_tool) 在 ascf_build 目录下, 关键
  元数据 (oh-package.json5 / module.json5 / build-profile.json5 /
  Index.ets / hvigorfile.ts / obfuscation-rules.txt) 之前被 .gitignore
  整体忽略, 从未被 git 跟踪, 导致 "module.name 被清空" 等回归无法被
  git diff / blame 追踪。

改动:
  1. .gitignore 改造
     - 不再整体 ignore ascf_build
     - 精确 ignore 已知产物路径 (rawfile/**/*.pack.js / rawfile/**/*.html
       / rawfile/**/*.json / build/ / oh_modules/ / .preview/ / .cxx/
       / .test/ / node_modules/)
     - ! 取反保留 HAR 必需文件 (placeholder/index.*, rawfile/index.js,
       base/element/*.json)
     - 补充 entry / hvigor / 鸿蒙签名材料 / IDE 临时文件 ignore 规则
  2. 首次将 5 个 HAR 包的元数据纳入 git (40 个文件)
  3. 新增 scripts/fix-subpackage-module-names.js: 任何入口 require
     vue.config.js 时自动修复 oh-package.json5.name + module.json5.module.name
     双重覆盖, 防止 DevEco ohpm 报 "00604007 Field IS Empty Error" 或
     hvigor 报 "Schema validate failed"
  4. vue.config.js 顶层 IIFE 触发修复 (任何 require 立即生效, 不依赖
     webpack 钩子)
  5. entry/scripts/check-har-deps.js 扩展: 校验 ascf_build 子包
     module.json5.module.name 字段 (兜底校验)
  6. entry/har-deps-required.json5 扩展: 新增 subpackageModuleJson5
     路径映射 + ohModulesRoots 校验资源齐备性
  7. entry/README-HAR-DEPS.md 更新: 故障速查表新增 module.name 相关
     报错条目

预期效果:
  - HBuilderX 触发 vue-cli-service build → vue.config.js 自动修复子包
    name → DevEco ohpm install / hvigor schema 校验通过
  - check-har-deps.js 兜底, 任何回归立即被检测并报错
  - 团队成员 git pull 后能立即看到 ascf_build 元数据, 可用 git diff
    跟踪 module.name 等关键字段变更
This commit is contained in:
2026-07-30 14:26:55 +08:00
parent 3dd059a6f6
commit 8ebd7918fb
48 changed files with 2870 additions and 4 deletions

View File

@@ -490,14 +490,115 @@ class VersionInjectPlugin {
copyDir(sourceDir, destDir);
console.log(' ✅ 拷贝完成');
// 同步修正 ascf_build 下 5 个子包 HAR 的 module.json5.module.name
// 原因: 模板里 module.name 经常被写成空串或不正确的值,
// 导致鸿蒙构建时 hvigor schema 校验失败 (必须 ^[a-zA-Z][0-9a-zA-Z_.]*$)
// 这里强制按包目录名覆盖, 保证产物正确。
this._fixSubpackageModuleNames();
} catch (e) {
console.error(` ❌ 拷贝失败: ${e.message}`);
throw e;
}
}
/**
* 修正 ascf_build/<pkg>/src/main/module.json5 的 module.name 字段
*
* 背景:
* mp-harmony 项目的子包 HAR (components_diy / pages_goods / pages_order /
* pages_promotion / pages_tool) 在 ascf/ascf_build/ 目录下各自有
* src/main/module.json5, 其中 module.name 必须等于包名才能通过 hvigor schema。
*
* 这个 module.json5 是项目源码里维护的模板, 经常因为:
* 1. uniapp 鸿蒙编译器输出空 name 字段
* 2. 模板里手动写错
* 3. 早期版本没这个文件, 后来手工补了一个错误的
* 导致 module.name 为空, 鸿蒙构建时 schema 校验失败:
* "Schema validate failed, must match pattern ^[a-zA-Z][0-9a-zA-Z_.]*$"
*
* 修复策略:
* 遍历 5 个子包, 用包目录名 (例: pages_tool) 覆盖 module.name,
* 确保构建产物始终正确。
*
* 注意:
* - 只覆盖 module.name, 其他字段保留 (deviceTypes / installationFree 等)
* - 如果 module.json5 不存在, 会按合理默认值新建一份
* - 如需新增/删除子包, 同步更新 SUBPACKAGE_NAMES 数组
*/
_fixSubpackageModuleNames() {
// 委托给模块级 fixSubpackageModuleNames, 行为一致
return fixSubpackageModuleNames();
}
}
/**
* 修正 ascf_build/<pkg>/src/main/module.json5 的 module.name 字段
*
* 实现已抽到独立模块 scripts/fix-subpackage-module-names.js,
* 这里仅 require + 转发, 避免 vue-cli-service 校验 module.exports 时报错。
*
* 背景:
* mp-harmony 项目的子包 HAR (components_diy / pages_goods / pages_order /
* pages_promotion / pages_tool) 在 ascf/ascf_build/ 目录下各自有
* src/main/module.json5, 其中 module.name 必须等于包名才能通过 hvigor schema。
*
* 这个 module.json5 是项目源码里维护的模板, 经常因为:
* 1. 模板里手动写错
* 2. 早期版本没这个文件, 后来手工补了一个错误的
* 3. 自动化脚本覆盖时丢失 name
* 导致 module.name 为空或错误, 鸿蒙构建时 schema 校验失败:
* "Schema validate failed, must match pattern ^[a-zA-Z][0-9a-zA-Z_.]*$"
*
* 使用:
* // vue.config.js 内部:
* const { fixSubpackageModuleNames } = require('./scripts/fix-subpackage-module-names');
* fixSubpackageModuleNames();
*
* // 独立跑:
* node scripts/fix-subpackage-module-names.js
*
* // CI 兜底校验:
* node stub-app-projects/mp-harmony/entry/scripts/check-har-deps.js --strict
*/
const { fixSubpackageModuleNames } = require('./scripts/fix-subpackage-module-names');
/**
* vue.config.js 顶层副作用: 任何入口 require 本文件时, 自动修正
* ascf_build/<pkg>/src/main/module.json5.module.name。
*
* 工作流覆盖:
* - HBuilderX 发行 → vue-cli-service build → require vue.config.js → 触发此钩子
* - 命令行 vue-cli-service build → 触发此钩子
* - 命令行 node -e "require('./vue.config.js')" → 触发此钩子
*
* 与 VersionInjectPlugin._copyMpHarmonyBuild 末尾的 _fixSubpackageModuleNames 重复
* 但更保险: 哪怕 webpack 钩子因为某些原因没触发, require 这层也会保证修复。
*/
(function _bootstrapFixSubpackageModuleNames() {
// 跳过生产测试门禁期间 (test-gate 会 fail 时, 不希望顺手修复文件)
if (process.env.NODE_ENV === 'production' && process.env.UNI_SCRIPT && process.env.__TEST_GATE_BLOCKED__) {
return;
}
try {
// 这里不传 silent, 让所有入口 (包括 HBuilderX / 命令行) 都能在 console 看到修复日志
fixSubpackageModuleNames();
} catch (e) {
console.error('[vue.config] bootstrap fixSubpackageModuleNames 失败:', e.message);
}
})();
// 导出配置
//
// 注意: 不要在这里 export 任何非白名单字段!
// vue-cli-service 会校验 vue.config.js 的导出 keys, 不允许出现未识别的字段
// (会报 "Invalid options in vue.config.js: \"<field>\" is not allowed")。
// 历史教训: 之前把 fixSubpackageModuleNames 放在 module.exports 上, 直接报这个错。
// 现在 fixSubpackageModuleNames 仅作为本文件内的顶层函数 + 顶层 IIFE 副作用,
// 不再 export。需要外部调用请走:
// node scripts/fix-subpackage-module-names.js
// 或:
// node -e "require('./scripts/fix-subpackage-module-names').fixSubpackageModuleNames()"
module.exports = {
productionSourceMap: false,
configureWebpack: config => {