开发环境迁移到 WSL:代码托管、编译、证书统一在 WSL 内进行 #2

Closed
opened 2026-10-29 08:26:44 +00:00 by laoyang · 1 comment
Owner

现象 / 诉求

原本鸿蒙开发在 Windows 侧(DevEco Studio + Git Bash + 本地 SDK)进行,现在开发环境整体搬到 WSL,
后续所有操作(拉代码、改代码、编译、提交推远端)都在 WSL 内完成。
Windows 侧只保留"取回编译产物"这一个动作。

具体四件事:

  1. 把 SyncCalendar clone 到 WSL 的 /home/yongquan/code/ 下,脱离 Windows 工作副本。
  2. 验证 WSL 内能否编译鸿蒙应用(这是本次的核心验证目标)——
    WSL 是 Linux,DevEco Studio 的图形 IDE 用不上,只能走 command-line-tools。
    需要确认:hvigorw assembleHap 能跑通、ArkTS 编译无错、能产出 .hap。
  3. 签名证书统一收到 ~/code/cert/ 下,正规命名存放——
    现状:证书散在 Windows 的 D:/Yongquan/DevEcoStudioProjects/sign/,
    文件名是随手起的(synccalendarDebug.cer、synccalendar_Release.p7b 大小写混杂)。
    目标:按 <bundle>.<用途>.<扩展名> 的规范重命名,与 ~/code/cert/familybook/ 已有风格对齐。
  4. 编译产出物用 scp 单独取回 Windows(WSL 内不落 Windows 路径依赖)。

关键约束(迁移时必须处理)

  • build-profile.json5 未被 git 跟踪(.gitignore 锚定根目录),clone 下来是没有的,
    构建会直接失败。必须按 WSL 的证书路径重新生成一份。
  • 该文件里的 storePassword / keyPassword 是 DevEco 加密过的密文串,
    DevEco 之外无法解密。WSL 里不能用这两串,需要另想办法(明文口令 / 环境变量)。
  • .gitignore 有 16 条 / 根锚定规则(/sign/、*.p12、/hvigor/* 等)——
    证书绝不能放进仓库目录,否则有泄露风险。
  • WSL 版 command-line-tools 是 26.0.0.851 / SDK API 26,与 Windows 侧 DevEco 版本要对得上,
    否则编译报错或产物不可用。
  • ohpm / hvigorw 不在 PATH 里,需要显式配置。
  • WSL 内不能跑模拟器/真机调试(hdc 对 Windows 侧设备不通用),本次只验证编译。

验收标准

  • /home/yongquan/code/SyncCalendar 存在,git log 与远端一致,工作区干净。
  • WSL 内 hvigorw assembleHap 编译成功,BUILD SUCCESSFUL,产出签名后的 .hap。
  • 证书全部落在 ~/code/cert/synccalendar/,命名规范、权限 600、不在 git 仓库内。
  • build-profile.json5 在 WSL 内可用(路径指向 WSL 证书),且仍被 .gitignore 忽略、不入库。
  • 编译产物用 scp 取回 Windows 可正常使用(体积、文件名正确)。
  • 全程不把任何私钥 / 口令 / 密文写进 git 跟踪的文件。
## 现象 / 诉求 原本鸿蒙开发在 Windows 侧(DevEco Studio + Git Bash + 本地 SDK)进行,现在**开发环境整体搬到 WSL**, 后续所有操作(拉代码、改代码、编译、提交推远端)都在 WSL 内完成。 Windows 侧只保留"取回编译产物"这一个动作。 具体四件事: 1. **把 `SyncCalendar` clone 到 WSL 的 `/home/yongquan/code/` 下**,脱离 Windows 工作副本。 2. **验证 WSL 内能否编译鸿蒙应用**(这是本次的核心验证目标)—— WSL 是 Linux,DevEco Studio 的图形 IDE 用不上,只能走 command-line-tools。 需要确认:`hvigorw assembleHap` 能跑通、ArkTS 编译无错、能产出 `.hap`。 3. **签名证书统一收到 `~/code/cert/` 下,正规命名存放**—— 现状:证书散在 Windows 的 `D:/Yongquan/DevEcoStudioProjects/sign/`, 文件名是随手起的(`synccalendarDebug.cer`、`synccalendar_Release.p7b` 大小写混杂)。 目标:按 `<bundle>.<用途>.<扩展名>` 的规范重命名,与 `~/code/cert/familybook/` 已有风格对齐。 4. **编译产出物用 `scp` 单独取回 Windows**(WSL 内不落 Windows 路径依赖)。 ## 关键约束(迁移时必须处理) - `build-profile.json5` **未被 git 跟踪**(`.gitignore` 锚定根目录),clone 下来是**没有的**, 构建会直接失败。必须按 WSL 的证书路径重新生成一份。 - 该文件里的 `storePassword` / `keyPassword` 是 DevEco 加密过的密文串, **DevEco 之外无法解密**。WSL 里不能用这两串,需要另想办法(明文口令 / 环境变量)。 - `.gitignore` 有 16 条 `/` 根锚定规则(`/sign/`、`*.p12`、`/hvigor/*` 等)—— **证书绝不能放进仓库目录**,否则有泄露风险。 - WSL 版 command-line-tools 是 `26.0.0.851` / SDK **API 26**,与 Windows 侧 DevEco 版本要对得上, 否则编译报错或产物不可用。 - `ohpm` / `hvigorw` 不在 PATH 里,需要显式配置。 - WSL 内不能跑模拟器/真机调试(`hdc` 对 Windows 侧设备不通用),本次只验证**编译**。 ## 验收标准 - `/home/yongquan/code/SyncCalendar` 存在,`git log` 与远端一致,工作区干净。 - WSL 内 `hvigorw assembleHap` 编译成功,**`BUILD SUCCESSFUL`**,产出签名后的 `.hap`。 - 证书全部落在 `~/code/cert/synccalendar/`,命名规范、权限 `600`、**不在 git 仓库内**。 - `build-profile.json5` 在 WSL 内可用(路径指向 WSL 证书),且仍被 `.gitignore` 忽略、不入库。 - 编译产物用 `scp` 取回 Windows 可正常使用(体积、文件名正确)。 - 全程不把任何私钥 / 口令 / 密文写进 git 跟踪的文件。
Author
Owner

✅ 验证完成:WSL 内可以完整编译鸿蒙应用

结论先说

不需要 DevEco Studio。 WSL 内 assembleHap(debug)与 assembleApp(release)都跑通了,
从零全量重建也通过。唯一不能做的是模拟器与真机调试(hdc 对 Windows 侧设备不通用)
和图形 IDE 相关功能。

一、代码已迁入 WSL

/home/yongquan/code/SyncCalendar
  clone 自 https://code.yangyq.net/laoyang/SyncCalendar.git
  10 个 tag 齐全(v0.0.1 ~ v0.1.0)
  git rev-list --left-right --count origin/master...master → 0  0

二、证书已按规范收纳(~/code/cert/synccalendar/)

命名规则 <包名>.<用途>.<扩展名>,与已有的 cert/familybook/ 同一风格:

文件 说明
synccalendar.yangyq.net.p12 密钥库,debug/release 共用,别名 synccalendar_release
synccalendar.yangyq.net.debug.cer 证书链终端 …\,Development
synccalendar.yangyq.net.debug.p7b uuid 648620fa-309b-487d-a85b-cf5d089a8e42
synccalendar.yangyq.net.release.cer 证书链终端 …\,Release
synccalendar.yangyq.net.release.p7b uuid 3c28865b-7413-482e-8593-0aef8fb219e2,app_gallery
synccalendar.yangyq.net.csr 留档,CN=synccalendar_release
material/ 口令解密材料
README.md 清单、算法说明、验签命令

权限:目录 700、文件 600。全部在 git 仓库之外,.gitignore 的
*.p12/*.cer/*.p7b 等规则也不会误收纳。

原 Windows 侧 D:\Yongquan\DevEcoStudioProjects\sign\ 原件保留未动。

三、迁移中踩的两个坑(都会卡住别人,记在这)

1. 口令字段必须是密文,且必须配 p12 同目录的 material/

build-profile.json5 没被 git 跟踪(.gitignore:33),clone 后是没有的,必须现造。
三种失败形态:

报错 原因
00303116 …length of the storePassword or keyPassword field is less than 32 填了明文。hvigor 要的是 DevEco 加密后的 hex 密文(92 字符)
00303242 Signature material verification failed, as: Unsupported state or unable to authenticate data 密文对,但 material/ 与加密时的不是同一套
ENOENT: no such file or directory, stat '…/material' material/ 没放在 storeFile 同目录

hvigor 只在 storeFile 同目录下找 material/,位置由 p12 路径决定,所以证书目录结构
必须保持 cert/synccalendar/{材料, material/} 这个形态。

Windows 那份密文用现在的 material 解不开(早期生成密文时材料已换代)。
好在 p12 明文口令本身是好的(keytool -list 能正常打开、别名 synccalendar_release),
于是用现有 material 重新加密同一口令,SignHap 随即通过。

相关工具已放到 ~/code/tools/pwd-tool.js(复刻 hvigor 的 DecipherUtil,带自检回解),
以后要改口令直接用它,不用再翻源码。

2. WSL → Windows 的 scp 不通

Windows 侧 sshd 22 端口未开放,"从 WSL 推到 Windows"这条路走不通。
解法是把方向反过来 —— 由 Windows 侧 scp wsl-local:... 本地路径 拉取,
不需要 Windows 开 sshd。已实测可用并做过双向 sha256 比对。

四、实测结果

项 结果
assembleHap(debug) BUILD SUCCESSFUL in 11s,uuid 648620fa…、"type":"debug"
assembleApp(release) BUILD SUCCESSFUL in 17s,uuid 3c28865b…、type:release、app-distribution-type: app_gallery
从零全量重建(先 clean) BUILD SUCCESSFUL in 18s,34 任务全执行、0 up-to-date
产物版本 pack.info = 0.1.0 / code 10000 / build 1 ✓
scp 回流 Windows 与 WSL 侧 sha256 逐字节一致
ArkTS 编译 0 错误,仅有既存的 back deprecated 等 WARN

产物:

  • SyncCalendar_v0.1.0_10000.app 1,397,077 B(release 签名,上架用)
  • entry-default-debug.hap 3,521,404 B(debug 签名,真机装)
  • 落点 D:\Yongquan\code\_harmonyos-builds\synccalendar\20261029-172639\

五、⚠️ 一个顺序陷阱(重要)

必须先打 app 再打 hap。 release 流程会用 release 签名覆盖
entry/build/.../entry-default-signed.hap;此时如果直接取这个 hap,
拿到的是 release 签名版,装真机会报 9568322。
本次已重建 debug hap 后才取回,并确认 uuid 是 648620fa…。

六、后续操作方式

ssh wsl-local 'bash ~/code/tools/build-sc.sh hap'    # 调试 hap
ssh wsl-local 'bash ~/code/tools/build-sc.sh app'    # 上架 app(自动切回 default 签名)
ssh wsl-local 'bash ~/code/tools/build-sc.sh clean'  # 清产物

# 取回产物(Windows 侧执行)
scp -q wsl-local:"~/code/SyncCalendar/build/outputs/default/SyncCalendar-default-signed.app" <本地>

构建脚本、切换签名脚本、口令工具都放在 ~/code/tools/(仓库外),
不污染代码库,git status 保持干净。

未覆盖的部分

  • 模拟器运行、真机安装与调试 —— 本次未验证,WSL 内也不具备条件。
  • 官网部署(sf.html 等)仍走原有 sftp 流程,与本次迁移无关。
## ✅ 验证完成:WSL 内可以完整编译鸿蒙应用 ### 结论先说 **不需要 DevEco Studio。** WSL 内 `assembleHap`(debug)与 `assembleApp`(release)都跑通了, 从零全量重建也通过。**唯一不能做的是模拟器与真机调试**(`hdc` 对 Windows 侧设备不通用) 和图形 IDE 相关功能。 ### 一、代码已迁入 WSL ``` /home/yongquan/code/SyncCalendar clone 自 https://code.yangyq.net/laoyang/SyncCalendar.git 10 个 tag 齐全(v0.0.1 ~ v0.1.0) git rev-list --left-right --count origin/master...master → 0 0 ``` ### 二、证书已按规范收纳(`~/code/cert/synccalendar/`) 命名规则 `<包名>.<用途>.<扩展名>`,与已有的 `cert/familybook/` 同一风格: | 文件 | 说明 | |---|---| | `synccalendar.yangyq.net.p12` | 密钥库,debug/release 共用,别名 `synccalendar_release` | | `synccalendar.yangyq.net.debug.cer` | 证书链终端 `…\,Development` | | `synccalendar.yangyq.net.debug.p7b` | uuid `648620fa-309b-487d-a85b-cf5d089a8e42` | | `synccalendar.yangyq.net.release.cer` | 证书链终端 `…\,Release` | | `synccalendar.yangyq.net.release.p7b` | uuid `3c28865b-7413-482e-8593-0aef8fb219e2`,`app_gallery` | | `synccalendar.yangyq.net.csr` | 留档,`CN=synccalendar_release` | | `material/` | 口令解密材料 | | `README.md` | 清单、算法说明、验签命令 | 权限:目录 `700`、文件 `600`。**全部在 git 仓库之外**,`.gitignore` 的 `*.p12`/`*.cer`/`*.p7b` 等规则也不会误收纳。 原 Windows 侧 `D:\Yongquan\DevEcoStudioProjects\sign\` 原件**保留未动**。 ### 三、迁移中踩的两个坑(都会卡住别人,记在这) **1. 口令字段必须是密文,且必须配 p12 同目录的 `material/`** `build-profile.json5` 没被 git 跟踪(`.gitignore:33`),clone 后是**没有的**,必须现造。 三种失败形态: | 报错 | 原因 | |---|---| | `00303116 …length of the storePassword or keyPassword field is less than 32` | 填了明文。hvigor 要的是 DevEco 加密后的 hex 密文(92 字符) | | `00303242 Signature material verification failed, as: Unsupported state or unable to authenticate data` | 密文对,但 `material/` 与加密时的不是同一套 | | `ENOENT: no such file or directory, stat '…/material'` | `material/` 没放在 `storeFile` 同目录 | **hvigor 只在 `storeFile` 同目录下找 `material/`**,位置由 p12 路径决定,所以证书目录结构 必须保持 `cert/synccalendar/{材料, material/}` 这个形态。 Windows 那份密文用现在的 material **解不开**(早期生成密文时材料已换代)。 好在 p12 明文口令本身是好的(`keytool -list` 能正常打开、别名 `synccalendar_release`), 于是用现有 material **重新加密同一口令**,`SignHap` 随即通过。 相关工具已放到 `~/code/tools/pwd-tool.js`(复刻 hvigor 的 `DecipherUtil`,带自检回解), 以后要改口令直接用它,不用再翻源码。 **2. WSL → Windows 的 scp 不通** Windows 侧 sshd 22 端口未开放,"从 WSL 推到 Windows"这条路走不通。 **解法是把方向反过来** —— 由 Windows 侧 `scp wsl-local:... 本地路径` **拉取**, 不需要 Windows 开 sshd。已实测可用并做过双向 sha256 比对。 ### 四、实测结果 | 项 | 结果 | |---|---| | `assembleHap`(debug) | **BUILD SUCCESSFUL in 11s**,uuid `648620fa…`、`"type":"debug"` | | `assembleApp`(release) | **BUILD SUCCESSFUL in 17s**,uuid `3c28865b…`、`type:release`、`app-distribution-type: app_gallery` | | 从零全量重建(先 `clean`) | **BUILD SUCCESSFUL in 18s**,34 任务全执行、0 up-to-date | | 产物版本 | `pack.info` = `0.1.0` / code `10000` / build 1 ✓ | | scp 回流 | Windows 与 WSL 侧 sha256 **逐字节一致** | | ArkTS 编译 | 0 错误,仅有既存的 `back` deprecated 等 WARN | 产物: - `SyncCalendar_v0.1.0_10000.app` 1,397,077 B(release 签名,上架用) - `entry-default-debug.hap` 3,521,404 B(debug 签名,真机装) - 落点 `D:\Yongquan\code\_harmonyos-builds\synccalendar\20261029-172639\` ### 五、⚠️ 一个顺序陷阱(重要) **必须先打 `app` 再打 `hap`。** release 流程会用 release 签名**覆盖** `entry/build/.../entry-default-signed.hap`;此时如果直接取这个 hap, 拿到的是 release 签名版,装真机会报 `9568322`。 本次已重建 debug hap 后才取回,并确认 uuid 是 `648620fa…`。 ### 六、后续操作方式 ```bash ssh wsl-local 'bash ~/code/tools/build-sc.sh hap' # 调试 hap ssh wsl-local 'bash ~/code/tools/build-sc.sh app' # 上架 app(自动切回 default 签名) ssh wsl-local 'bash ~/code/tools/build-sc.sh clean' # 清产物 # 取回产物(Windows 侧执行) scp -q wsl-local:"~/code/SyncCalendar/build/outputs/default/SyncCalendar-default-signed.app" <本地> ``` 构建脚本、切换签名脚本、口令工具**都放在 `~/code/tools/`(仓库外)**, 不污染代码库,`git status` 保持干净。 ### 未覆盖的部分 - 模拟器运行、真机安装与调试 —— 本次未验证,WSL 内也不具备条件。 - 官网部署(`sf.html` 等)仍走原有 `sftp` 流程,与本次迁移无关。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/SyncCalendar#2