鴻蒙項目構建配置
參考文檔
深入鴻蒙開發之后,一般會遇到以下幾個問題。
- 每次編譯的時候需要手動配置不同的 versionCode 和 versionName;
- 在使用 git 管理代碼的時候,不同的人或者不在同一臺電腦上,dev eco 這個編譯器需要經常的給開發版本簽名,在發布版本的時候還需要手動配置相應的簽名;
- 每次編譯的產物都叫做 default.app,只能通過文件更新時間來判斷是否編譯完成了;
- 華為后臺推出了崩潰分析之后,sourceMap 變的十分重要了,重新編譯會導致老的 sourceMap 被刪除掉;
為了解決上述問題,研究了一下 hvigor 編譯環境,然后就有了這篇的解決方案。基本上能解決以上遇到的問題。
如何做
為了避免看的比較凌亂,遺漏掉某一個步驟,就直接寫怎么做了。看到有用的就參考一下吧。
以下文件都是在根目錄中創建。
- 創建 debug-signing-config.json 文件,目的是開發時候使用到的自動簽名;
- 創建 release-signing-config.json 文件,目的是發布時候使用到的自動簽名;
- 創建 versionName.json,目的是寫一個 versionName,單獨存放存儲,方便修改;
- 創建 sourceMaps 文件夾,存放 sourceMaps 文件,方便后續管理編譯的 sourceMap;
一定要把 debug-signing-config.json 跟 release-signing-config.json 配置好,要不然跑不起來,ide 會檢測配置的文件是否存在。可以先都用 debug-signing-config.json 的配置,等弄好了再切換成 release 版本。
debug-signing-config.json
這個是首先先自動簽名一次開發版本的簽名文件,然后把 build-profile.json5 中的內容拷貝到這個里邊。然后在 .gitignore 中忽略掉這個文件,這樣每臺電腦上的這個文件都不需要提交了,也就不會頻繁的簽名了。
{"material": {"certpath": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyeb8iqKwiRH18uy4B2GvE2Yc=.cer","keyAlias": "debugKey","keyPassword": "0000001B01A5432AA50AB7DAD5B8027838C12E3783A6D359BE407801ds714C1E5055FF424DF8A63A4B0FE4D4","profile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHsAyb8iqKwiRH18uy4B2GvE2Yc=.p7b","signAlg": "SHA256withECDSA","storeFile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyfb8iqKwiRH18uy4B2GvE2Yc=.p12","storePassword": "0000001B63267DFD40B6449627CE6220F414AB3A3647558ef3D3A9E5766490A610B7ADFD0875AA1540E4B0C5"}
}
release-signing-config.json
發布版本的簽名配置文件。
{"material": {"certpath": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyeb8iqKwiRH18uy4B2GvE2Yc=.cer","keyAlias": "debugKey","keyPassword": "0000001B01A5432AA50AB7DAD5B8027838C12E3783A6D359BE407801ds714C1E5055FF424DF8A63A4B0FE4D4","profile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHsAyb8iqKwiRH18uy4B2GvE2Yc=.p7b","signAlg": "SHA256withECDSA","storeFile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyfb8iqKwiRH18uy4B2GvE2Yc=.p12","storePassword": "0000001B63267DFD40B6449627CE6220F414AB3A3647558ef3D3A9E5766490A610B7ADFD0875AA1540E4B0C5"}
}
versionName.json
版本號配置文件;
{"versionName": "1.0.1"
}
最重要的修改 hvigorfile.ts
整體修改代碼如下:
genVersionCode 自動生成 versionCode,格式為:yyMM+(ddhhmm),因為 versionCode 的數字不能太大。
output.artifactName 為 ${versionName}.${versionCode}
能夠看到每次編譯的版本號。
最后把當次編譯的結果都放到了 sourceMaps 的文件夾中,有需要可以直接上傳了。
官方文檔 API 介紹
示例工程
import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import * as debugMaterial from './debug-signing-config.json'; // 引入外部配置
import * as releaseMaterial from './release-signing-config.json'; // release配置
import * as versionData from './versionName.json'; // 引入外部配置
import { hvigor, FileUtil, getNode } from '@ohos/hvigor'
import { rename, rm } from 'fs/promises';function genVersionCode() {const d = new Date();const year = d.getFullYear().toString().slice(-2);const month = (d.getMonth() + 1).toString().padStart(2, '0');const day = d.getDate();const hour = d.getHours();const minute = d.getMinutes();const end = (day * hour * minute).toString().padStart(5, '0');return parseInt(year + month + end);
}const versionName = versionData.versionName
const versionCode = genVersionCode()const properties = hvigor.getParameter().getProperties();
console.log(`properties is ${JSON.stringify(properties)}`)
const startParams = hvigor.getParameter().getStartParams();
console.log(`startParams is ${JSON.stringify(startParams)}`)
const extParams = hvigor.getParameter().getExtParams();
console.log(`extParams is ${JSON.stringify(extParams)}`)
const buildMode = extParams['buildMode'] // 獲取編譯mode,不同的mode使用不同的配置const needCopySourceMap = !!!extParams['module'] ? true : false
console.log(`needCopySourceMap ${needCopySourceMap} ${!!!extParams['module']}`)hvigor.getRootNode().afterNodeEvaluate(rootNode => {const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;const appJsonOpt = appContext.getAppJsonOpt();appJsonOpt['app']['versionCode'] = versionCode;appJsonOpt['app']['versionName'] = versionName;appContext.setAppJsonOpt(appJsonOpt);const buildProfileOpt = appContext.getBuildProfileOpt();buildProfileOpt['app']['signingConfigs'] = [{"name": "default","type": "HarmonyOS","material": buildMode == 'debug' ? debugMaterial.material : releaseMaterial.material}];buildProfileOpt['app']['products'] = [{"name": "default","signingConfig": "default","targetSdkVersion": "5.1.0(18)","compatibleSdkVersion": "5.0.1(13)","runtimeOS": "HarmonyOS","output": {"artifactName": `${versionName}.${versionCode}`},"buildOption": {"strictMode": {"caseSensitiveCheck": true,"useNormalizedOHMUrl": true}}}];appContext.setBuildProfileOpt(buildProfileOpt);
})const currentNode = getNode(__filename);
hvigor.buildFinished(async buildResult => {if (buildResult.getError()) {console.log(buildResult.getError().stack);} else {if (needCopySourceMap) {const context = currentNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;const base = context.getProjectPath()const sourceMaps = FileUtil.pathResolve(base, 'entry/build/default/outputs/default/symbol/release/entry-sourceMaps.map');if (FileUtil.exist(sourceMaps)) {const renameSourceMaps = FileUtil.pathResolve(base, `entry/build/default/outputs/default/symbol/release/${versionCode}.map`);await rename(sourceMaps, renameSourceMaps)const targetSourceMaps = FileUtil.pathResolve(base, `sourceMaps/${versionCode}.map`);FileUtil.copyFileSync(renameSourceMaps, targetSourceMaps);}}}
})export default {system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[], /* Custom plugin to extend the functionality of Hvigor. */
}