Electron打包(三)——版本自動更新-疑難問題

Electron項目進行應(yīng)用程序更新藻肄,我們使用electronr-builder方式打包,由于項目的主進程邏輯總是需要迭代優(yōu)化僵腺,“增量更新”不滿足業(yè)務(wù)需求呵晚,因此采用“全量更新”。

“全量更新”面臨的問題:

前提:Electron自身提供的打包程序必盖,在安裝時界面不優(yōu)雅拌牲,因此我們使用自定義的安裝程序美化工具打包應(yīng)用。

(1)更新包不知道舊應(yīng)用程序安裝在用戶磁盤的哪個路徑
(2)舊應(yīng)用程序路徑內(nèi)文件已存在歌粥,文件更新時不能直接進行覆蓋塌忽,會生成額外文件夾存放
(3)舊應(yīng)用程序中用戶已經(jīng)進行過自定義選項配置,更新包覆蓋導(dǎo)致用戶配置數(shù)據(jù)丟失
(4)舊應(yīng)用程序和更新包都存在卸載程序失驶,需要刪除更新包的卸載程序土居,沿用舊包卸載功能

1. 更新包讀取注冊表內(nèi)應(yīng)用安裝路徑

(1)nsis配置
nsis配置:指安裝過程的配置,如果不配置應(yīng)用程序自動安裝在C盤嬉探。
在package.json文件build中nsis這個選項中配置自定義的nsis腳本

"nsis": {
    "oneClick": false, // 是否一鍵安裝
    "perMachine": true,  // 是否顯示輔助安裝程序頁面
    "allowElevation": true, // 允許請求提升(僅限輔助安裝程序)
    "installerIcon": "build/icons/icon.ico", // 安裝圖標
    "installerHeaderIcon": "build/icons/icon.ico", // 安裝時頭部圖標
    "createDesktopShortcut": false,  // 創(chuàng)建桌面圖標
    "createStartMenuShortcut": false, // 創(chuàng)建開始菜單圖標
    "artifactName": "${productName}_${version}.${ext}", // 生成打包文件名稱
    "shortcutName": "XXXXX", // 圖標名稱
    "include": "config/installer.nsh" // 包含的自定義nsis腳本
},

(2)創(chuàng)建自定義的nsis腳本文件
在nsis腳本中擦耀,讀取注冊表中舊應(yīng)用程序的安裝路徑,并對更新包的安裝路徑進行設(shè)置涩堤。

# installer.nsh
!macro preInit
    ReadRegStr $0 HKLM "Software\ProjectName\XXX" "Path"
    SetRegView 64
    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation $0
    WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation $0
    SetRegView 32
    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation $0
    WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation $0
!macroend

2. 更新包覆蓋舊應(yīng)用程序路徑內(nèi)文件

在package.json文件build中nsis選項中配置:

"nsis": {
    "allowToChangeInstallationDirectory": false, // 允許修改安裝目錄(僅限輔助安裝程序)
}

這樣我們使用electron-updater進行更新的時候眷蜓,就會安裝到我們設(shè)置的軟件安裝路徑中,不會產(chǎn)生額外的文件夾胎围。

3. 版本更新后保存用戶配置

用戶配置文件bin:存放在安裝程序的根目錄吁系。
C盤存儲用戶信息:C:\Users\DN\AppData\Local\Temp/ProjectName/bin

思路:在版本更新時白魂,拷貝用戶配置bin文件到C盤緩存路徑下汽纤;程序更新完成后重新啟動,若C盤緩存路徑能讀取用戶配置文件碧聪,則拷貝回來覆蓋到安裝程序的bin文件下冒版。

(1)檢測到版本更新時液茎,用戶點擊“確認更新”操作

  • 獲瘸炎恕:用戶配置文件bin路徑辞嗡、用戶磁盤文件緩存路徑
  • 拷貝:bin文件備份到緩存路徑
// 渲染進程中用戶確認更新版本
ipcMain.handle('sure-update-now', () => {
    log.info('更新版本:開始下載');
    //配置文件bin路徑
    let binPath = path.join(process.cwd(), 'bin')
    //臨時路徑
    let tempPath = app.getPath('temp') +'/ProjectName/bin'
    //拷貝文件夾
    if(index.isEmpty(binPath)){
      log.info('bin文件為空');
    } else {
      copyFolder(binPath,tempPath)
      log.info('更新版本:拷貝bin文件到緩存路徑完成');
    }
    autoUpdater.downloadUpdate().then((path)=>{
      log.info('更新版本:download path',path);
      console.log("download path", path)
    })
})

(2)應(yīng)用程序啟動,讀取C盤緩存路徑
程序啟動滞造,當前根目錄不存在bin文件夾時续室,檢測C盤緩存路徑是否存在用戶配置bin文件,存在則拷貝回根目錄bin下

// 下載配置文件
    try{
      // 用戶緩存中讀取用戶配置
      let binPath = path.join(process.cwd(), 'bin') // 用戶配置文件bin路徑
      let tempPath = app.getPath('temp') +'/BigFoot/bin' // c盤臨時路徑
      if (!fs.existsSync(binPath) && fs.existsSync(tempPath)) {
        log.info('發(fā)現(xiàn)當前bin文件不存在谒养,開始從緩存讀取====');
        await copyFolder(tempPath,binPath)
      }
      ...
      // 創(chuàng)建主界面
      setTimeout(() => {
        log.info('創(chuàng)建主界面成功挺狰!');
        createMainWindow()
      }, 500)
    }catch(error){
      log.warn('創(chuàng)建主界面前,下載配置文件出錯了B蚩摺7岵础!J忌堋M骸!');
    }

4. 刪除更新包的卸載程序

舊應(yīng)用程序存在卸載程序亏推,更新包也存在卸載程序学赛,兩個卸載程序重復(fù),需要刪除更新包的卸載程序

// 下載配置文件
    try{
      // 用戶緩存中讀取用戶配置
      ...
      // 如果是更新版本吞杭,需要刪除舊的卸載程序exe
      let oldUninstallFilePath = path.join(process.cwd(), 'uninst.exe');
      let newUninstallFilePath = path.join(process.cwd(), 'Uninstall XXX.exe');
      if(fs.existsSync(oldUninstallFilePath) && fs.existsSync(newUninstallFilePath)) {
        log.info('當前是更新版本盏浇,刪除新的卸載程序exe====');
        fs.unlinkSync(newUninstallFilePath); // 刪除新的卸載程序
      }
      // 創(chuàng)建主界面
      setTimeout(() => {
        log.info('創(chuàng)建主界面成功!');
        createMainWindow()
      }, 500)
    }catch(error){
      log.warn('創(chuàng)建主界面前芽狗,下載配置文件出錯了>铌!M妗B隆!柔昼!');
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哑芹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捕透,更是在濱河造成了極大的恐慌聪姿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乙嘀,死亡現(xiàn)場離奇詭異末购,居然都是意外死亡,警方通過查閱死者的電腦和手機虎谢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門盟榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婴噩,你說我怎么就攤上這事擎场∮鸬拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵迅办,是天一觀的道長宅静。 經(jīng)常有香客問我,道長站欺,這世上最難降的妖魔是什么姨夹? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮矾策,結(jié)果婚禮上磷账,老公的妹妹穿的比我還像新娘。我一直安慰自己贾虽,他們只是感情好够颠,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榄鉴,像睡著了一般履磨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆尘,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天剃诅,我揣著相機與錄音,去河邊找鬼驶忌。 笑死矛辕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的付魔。 我是一名探鬼主播聊品,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼几苍!你這毒婦竟也來了翻屈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤妻坝,失蹤者是張志新(化名)和其女友劉穎伸眶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刽宪,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡厘贼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了圣拄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘴秸。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岳掐,到底是詐尸還是另有隱情凭疮,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布岩四,位于F島的核電站,受9級特大地震影響哥攘,放射性物質(zhì)發(fā)生泄漏剖煌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一逝淹、第九天 我趴在偏房一處隱蔽的房頂上張望耕姊。 院中可真熱鬧,春花似錦栅葡、人聲如沸茉兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽规脸。三九已至,卻和暖如春熊咽,著一層夾襖步出監(jiān)牢的瞬間莫鸭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工横殴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留被因,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓衫仑,卻偏偏與公主長得像梨与,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子文狱,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容