diff --git a/en/rum/error-tracking/source-mapping.mdx b/en/rum/error-tracking/source-mapping.mdx
index cebd1e2c..6e834d3f 100644
--- a/en/rum/error-tracking/source-mapping.mdx
+++ b/en/rum/error-tracking/source-mapping.mdx
@@ -210,11 +210,18 @@ In **Application Management → Source Code Management → HarmonyOS**, the uplo
- Install the upload plugin in your HarmonyOS project:
+ Declare the plugin in the project's `hvigor/hvigor-config.json5` and let hvigor fetch it from npm:
- ```bash
- npm install -D @flashcatcloud/hvigor-plugin@^0.1.3
+ ```json5 hvigor/hvigor-config.json5
+ {
+ "modelVersion": "5.0.0",
+ "dependencies": {
+ "@flashcatcloud/hvigor-plugin": "0.1.4"
+ }
+ }
```
+
+ You can also run `npm install -D @flashcatcloud/hvigor-plugin`, but a HarmonyOS project root has no `package.json`, so run `npm init -y` first or npm installs into an unrelated project in a parent directory. See [HarmonyOS SDK advanced configuration](/en/rum/sdk/harmony/advanced-config).
Write the panel-generated `service`, `version`, and `apiKey` settings into `hvigorfile.ts`:
@@ -229,24 +236,25 @@ In **Application Management → Source Code Management → HarmonyOS**, the uplo
flashcatSymbolUploadPlugin({
apiKey: process.env.FLASHCAT_API_KEY ?? '',
service: 'my-app',
- version: '1.0.0',
- enabled: process.env.FLASHCAT_UPLOAD === '1'
+ version: '1.0.0'
})
]
};
```
- After the build artifacts are ready, run the upload task:
+ Once the build artifacts are ready, run the upload task. **`--no-daemon` is required when you configure the plugin from environment variables**, otherwise a reused hvigor daemon hands the plugin a stale environment, the API key reads as unset, and the upload is silently skipped:
```bash
- FLASHCAT_UPLOAD=1 FLASHCAT_API_KEY=your-api-key \
- hvigorw uploadFlashcatSymbols --mode module -p module=entry@default -p product=default
+ FLASHCAT_API_KEY=your-api-key \
+ hvigorw uploadFlashcatSymbols --no-daemon \
+ --mode module -p module=entry@default -p product=default
```
+- Use **0.1.4 or later**: 0.1.3 registered the task with a dependency on `assembleHar`, which does not exist in a HAP module, and the build fails outright
- On SaaS, omit `endpoint` — **hvigor-plugin ≥ 0.1.3** defaults to `https://ci.flashcat.cloud`. Do not use the RUM ingest host `browser.flashcat.cloud` (it 404s). For a private deployment set `FLASHCAT_SOURCEMAP_INTAKE_URL` (requires ≥ 0.1.3) or pass `endpoint` explicitly
- Native `.so` symbolication depends on the GNU build-id. The HarmonyOS NDK enables it by default; if your build pipeline disables it, add `-Wl,--build-id` explicitly
- For the full HarmonyOS integration, symbol-upload, and compatibility details, continue with [HarmonyOS SDK advanced configuration](/en/rum/sdk/harmony/advanced-config)
diff --git a/en/rum/sdk/harmony/advanced-config.mdx b/en/rum/sdk/harmony/advanced-config.mdx
index eacb7eaf..003c880a 100644
--- a/en/rum/sdk/harmony/advanced-config.mdx
+++ b/en/rum/sdk/harmony/advanced-config.mdx
@@ -431,12 +431,28 @@ The plugin uploads two artifact types:
| ArkTS Sourcemap | `sourceMaps.map`, optional `nameCache.json` | Restores ArkTS / TS files, functions, lines, and columns |
| Native symbols | Unstripped `.so` files | Resolves C/C++ frames by GNU build-id |
-The plugin ships as an npm package (on **npm**, not ohpm); install it as a build-time dev dependency in your project's root `package.json`, not in `oh-package.json5`:
+The plugin ships as an npm package (on **npm**, not ohpm). Declare it in `hvigor/hvigor-config.json5` and let hvigor fetch it from npm:
+
+```json5 hvigor/hvigor-config.json5
+{
+ "modelVersion": "5.0.0",
+ "dependencies": {
+ "@flashcatcloud/hvigor-plugin": "0.1.4"
+ }
+}
+```
+
+You can install it with npm instead. But a HarmonyOS project root has no `package.json`, and `npm install` walks *up* the directory tree looking for one — so it ends up installing into whatever unrelated project it finds in a parent directory (often your home directory). Create one first:
```bash
-npm install -D @flashcatcloud/hvigor-plugin@^0.1.3
+npm init -y # only if the project root has no package.json
+npm install -D @flashcatcloud/hvigor-plugin
```
+
+Use **0.1.4 or later**. 0.1.3 registered the upload task with dependencies on both `assembleHap` and `assembleHar`; a module has at most one of them, so the build fails outright with `Cannot find hvigor task 'assembleHar' in module 'entry'`.
+
+
Then register the plugin in the module's `hvigorfile.ts`:
```ts hvigorfile.ts
@@ -449,24 +465,30 @@ export default {
flashcatSymbolUploadPlugin({
apiKey: process.env.FLASHCAT_API_KEY ?? '',
service: 'shopping-app',
- version: '1.0.0',
- enabled: process.env.FLASHCAT_UPLOAD === '1'
+ version: '1.0.0'
})
]
};
```
-On SaaS, omit `endpoint` — **hvigor-plugin ≥ 0.1.3** defaults to `https://ci.flashcat.cloud` (**not** the RUM ingest host `browser.flashcat.cloud`). For a private deployment set `FLASHCAT_SOURCEMAP_INTAKE_URL` (scheme + host, no path; also requires ≥ 0.1.3), or pass `endpoint: 'https://rum.example.com'`. Plugin 0.1.2 does not honour `FLASHCAT_SOURCEMAP_INTAKE_URL` — set `endpoint` explicitly, or use the legacy `FLASHCAT_ENDPOINT` env var (deprecated in 0.1.3 but still honoured). `flashcatSymbolUploadPlugin()` also accepts two optional fields: `buildDir` (build output directory, default `build/default`) and `pluginVersion` (the version sent in the `DD-EVP-ORIGIN-VERSION` upload header, which defaults to the plugin's own version). Neither is normally required.
+On SaaS, omit `endpoint` — **hvigor-plugin ≥ 0.1.3** defaults to `https://ci.flashcat.cloud` (**not** the RUM ingest host `browser.flashcat.cloud`). For a private deployment set `FLASHCAT_SOURCEMAP_INTAKE_URL` (scheme + host, no path; also requires ≥ 0.1.3), or pass `endpoint: 'https://rum.example.com'`. Plugin 0.1.2 does not honour `FLASHCAT_SOURCEMAP_INTAKE_URL` — set `endpoint` explicitly, or use the legacy `FLASHCAT_ENDPOINT` env var (deprecated in 0.1.3 but still honoured). `flashcatSymbolUploadPlugin()` also accepts two optional fields: `buildDir` and `pluginVersion` (the version sent in the `DD-EVP-ORIGIN-VERSION` upload header, which defaults to the plugin's own version). **From 0.1.4 the build directory follows the product being built** (`-p product=beta` → `build/beta`), so pass `buildDir` only when the artifacts are somewhere else; 0.1.3 and earlier always used `build/default` and silently scanned the wrong directory for any other product.
-Run the upload task after a release build:
+After a release build, run the upload task as its own hvigor invocation:
```bash
-FLASHCAT_UPLOAD=1 FLASHCAT_API_KEY=*** \
- hvigorw uploadFlashcatSymbols --mode module -p module=entry@default -p product=default
+FLASHCAT_API_KEY=*** \
+ hvigorw uploadFlashcatSymbols --no-daemon \
+ --mode module -p module=entry@default -p product=beta
```
+
+`--no-daemon` is not optional when you configure the plugin from environment variables. hvigor builds through a long-lived daemon process, which **copies the environment once, when it is created**, and afterwards refreshes only a fixed allowlist (`DEVECO_SDK_HOME`, `OHOS_BASE_SDK_HOME`, and two incremental-build flags). A reused daemon therefore hands the plugin the environment of whoever started it — an IDE build, or an earlier command — not the one you just typed.
+
+The failure is silent: `FLASHCAT_API_KEY` reads as unset and the upload is skipped with a single log line, or a stale key ends in a 401 — either way the build still succeeds. Values written directly into `hvigorfile.ts` are not affected.
+
+
The plugin sends `multipart/form-data` to `{endpoint}/sourcemap/upload`:
| Header | Value |
diff --git a/zh/rum/error-tracking/source-mapping.mdx b/zh/rum/error-tracking/source-mapping.mdx
index a1b07020..98589774 100644
--- a/zh/rum/error-tracking/source-mapping.mdx
+++ b/zh/rum/error-tracking/source-mapping.mdx
@@ -211,11 +211,18 @@ HarmonyOS 崩溃栈可能同时包含 **ArkTS / JS 帧** 和 **Native `.so` 帧*
- 在 HarmonyOS 工程中安装上传插件:
+ 在工程的 `hvigor/hvigor-config.json5` 中声明依赖,由 hvigor 自行从 npm 拉取:
- ```bash
- npm install -D @flashcatcloud/hvigor-plugin@^0.1.3
+ ```json5 hvigor/hvigor-config.json5
+ {
+ "modelVersion": "5.0.0",
+ "dependencies": {
+ "@flashcatcloud/hvigor-plugin": "0.1.4"
+ }
+ }
```
+
+ 也可以用 `npm install -D @flashcatcloud/hvigor-plugin` 安装,但鸿蒙工程根目录默认没有 `package.json`,需先执行 `npm init -y`,否则会装到父目录的无关工程里。详见 [HarmonyOS SDK 高级配置](/zh/rum/sdk/harmony/advanced-config)。
把控制台面板生成的 `service`、`version` 与 `apiKey` 配置写入 `hvigorfile.ts`:
@@ -230,24 +237,25 @@ HarmonyOS 崩溃栈可能同时包含 **ArkTS / JS 帧** 和 **Native `.so` 帧*
flashcatSymbolUploadPlugin({
apiKey: process.env.FLASHCAT_API_KEY ?? '',
service: 'my-app',
- version: '1.0.0',
- enabled: process.env.FLASHCAT_UPLOAD === '1'
+ version: '1.0.0'
})
]
};
```
- 在构建产物生成后执行上传任务:
+ 在构建产物生成后执行上传任务。**用环境变量配置时必须加 `--no-daemon`**,否则 hvigor 复用的守护进程会拿到陈旧的环境变量,导致 API Key 读不到、上传被静默跳过:
```bash
- FLASHCAT_UPLOAD=1 FLASHCAT_API_KEY=your-api-key \
- hvigorw uploadFlashcatSymbols --mode module -p module=entry@default -p product=default
+ FLASHCAT_API_KEY=your-api-key \
+ hvigorw uploadFlashcatSymbols --no-daemon \
+ --mode module -p module=entry@default -p product=default
```
+- 请使用 **0.1.4 及以上**版本:0.1.3 注册任务时会声明不存在的 `assembleHar` 依赖,导致构建直接失败
- 公有云省略 `endpoint` 时,**hvigor-plugin ≥ 0.1.3** 默认上传到 `https://ci.flashcat.cloud`。不要用 RUM 上报域名 `browser.flashcat.cloud`(会 404)。私有化设置 `FLASHCAT_SOURCEMAP_INTAKE_URL`(需 ≥ 0.1.3)或显式传 `endpoint`
- Native `.so` 需要保留 GNU build-id;HarmonyOS NDK 默认开启,如你的构建链路关闭了它,请显式添加 `-Wl,--build-id`
- 更完整的 HarmonyOS 接入、符号上传和兼容性说明,请继续阅读 [HarmonyOS SDK 高级配置](/zh/rum/sdk/harmony/advanced-config)
diff --git a/zh/rum/sdk/harmony/advanced-config.mdx b/zh/rum/sdk/harmony/advanced-config.mdx
index 8b98fbb1..12714a0f 100644
--- a/zh/rum/sdk/harmony/advanced-config.mdx
+++ b/zh/rum/sdk/harmony/advanced-config.mdx
@@ -431,12 +431,28 @@ async onWorkStart(workInfo: workScheduler.WorkInfo): Promise {
| ArkTS Sourcemap | `sourceMaps.map`,可选 `nameCache.json` | 还原 ArkTS / TS 文件、函数、行列号 |
| Native 符号 | 未 strip 的 `.so` 文件 | 根据 GNU build-id 解析 C/C++ 栈帧 |
-该插件以 npm 包发布(在 **npm**,不在 ohpm),作为构建期开发依赖安装到工程根目录的 `package.json`,而不是 `oh-package.json5`:
+该插件以 npm 包发布(在 **npm**,不在 ohpm)。推荐在 `hvigor/hvigor-config.json5` 中声明,由 hvigor 自行从 npm 拉取:
+
+```json5 hvigor/hvigor-config.json5
+{
+ "modelVersion": "5.0.0",
+ "dependencies": {
+ "@flashcatcloud/hvigor-plugin": "0.1.4"
+ }
+}
+```
+
+也可以用 npm 安装。但鸿蒙工程根目录默认**没有** `package.json`,而 `npm install` 会逐级向上查找,最终把依赖装进父目录里某个无关工程(常见是用户主目录),所以要先创建一个:
```bash
-npm install -D @flashcatcloud/hvigor-plugin@^0.1.3
+npm init -y # 仅在工程根目录没有 package.json 时执行
+npm install -D @flashcatcloud/hvigor-plugin
```
+
+请使用 **0.1.4 及以上**版本。0.1.3 在注册上传任务时同时声明了 `assembleHap` 和 `assembleHar` 两个依赖,而一个模块最多只有其中一个,会导致构建直接失败:`Cannot find hvigor task 'assembleHar' in module 'entry'`。
+
+
然后在模块的 `hvigorfile.ts` 中注册插件:
```ts hvigorfile.ts
@@ -449,24 +465,30 @@ export default {
flashcatSymbolUploadPlugin({
apiKey: process.env.FLASHCAT_API_KEY ?? '',
service: 'shopping-app',
- version: '1.0.0',
- enabled: process.env.FLASHCAT_UPLOAD === '1'
+ version: '1.0.0'
})
]
};
```
-公有云省略 `endpoint` 时,**hvigor-plugin ≥ 0.1.3** 默认上传到 `https://ci.flashcat.cloud`(**不是** RUM 上报用的 `browser.flashcat.cloud`)。私有化部署请设置环境变量 `FLASHCAT_SOURCEMAP_INTAKE_URL`(协议 + 域名,不带路径;同样需要 ≥ 0.1.3),或传 `endpoint: 'https://rum.example.com'`。旧版 0.1.2 不认 `FLASHCAT_SOURCEMAP_INTAKE_URL`,可显式写 `endpoint`,或设置旧环境变量 `FLASHCAT_ENDPOINT`(0.1.3 起弃用,但仍生效)。`flashcatSymbolUploadPlugin()` 还接受两个可选参数:`buildDir`(构建产物目录,默认 `build/default`)和 `pluginVersion`(写入上传请求头 `DD-EVP-ORIGIN-VERSION` 的版本号,默认与插件版本一致)。一般无需设置。
+公有云省略 `endpoint` 时,**hvigor-plugin ≥ 0.1.3** 默认上传到 `https://ci.flashcat.cloud`(**不是** RUM 上报用的 `browser.flashcat.cloud`)。私有化部署请设置环境变量 `FLASHCAT_SOURCEMAP_INTAKE_URL`(协议 + 域名,不带路径;同样需要 ≥ 0.1.3),或传 `endpoint: 'https://rum.example.com'`。旧版 0.1.2 不认 `FLASHCAT_SOURCEMAP_INTAKE_URL`,可显式写 `endpoint`,或设置旧环境变量 `FLASHCAT_ENDPOINT`(0.1.3 起弃用,但仍生效)。`flashcatSymbolUploadPlugin()` 还接受两个可选参数:`buildDir` 和 `pluginVersion`(写入上传请求头 `DD-EVP-ORIGIN-VERSION` 的版本号,默认与插件版本一致)。**0.1.4 起产物目录会自动跟随构建的 product**(`-p product=beta` → `build/beta`),只有产物不在该位置时才需要传 `buildDir`;0.1.3 及更早固定使用 `build/default`,构建非 default product 时会静默扫描到错误的目录。
-发布构建后执行上传任务:
+发布构建完成后,把上传任务作为一次独立的 hvigor 调用执行:
```bash
-FLASHCAT_UPLOAD=1 FLASHCAT_API_KEY=*** \
- hvigorw uploadFlashcatSymbols --mode module -p module=entry@default -p product=default
+FLASHCAT_API_KEY=*** \
+ hvigorw uploadFlashcatSymbols --no-daemon \
+ --mode module -p module=entry@default -p product=beta
```
+
+用环境变量配置插件时,`--no-daemon` 不是可选项。hvigor 默认通过常驻的守护进程构建,该进程**只在创建时拷贝一次环境变量**,之后仅刷新固定白名单(`DEVECO_SDK_HOME`、`OHOS_BASE_SDK_HOME` 及两个增量构建开关)。因此复用守护进程时,插件读到的是**启动那个守护进程的人**的环境变量——可能来自 IDE 构建,也可能来自你上一条命令——而不是你刚敲进去的这份。
+
+失败是静默的:`FLASHCAT_API_KEY` 读不到就跳过上传(只打一行日志),旧的 Key 则会以 401 结束——两种情况构建都照样成功。直接写在 `hvigorfile.ts` 里的值不受影响。
+
+
插件会向 `{endpoint}/sourcemap/upload` 发送 `multipart/form-data`:
| Header | 值 |