使用electron-packager electron-builder electron-updater 打包vue项目,支持在线更新

1.如何用electron-packager electron-builder打包vue项目,打包成桌面程序。

步骤一、

   执行npm run build 打包你的vue项目。

    打包成功后,生成dist打包后的文件。

    在dist打开命令行, 安装electron-packager electron-builder 

    安装命令  npm install electron-packager    npm install electron-builder 

    在dist中新增main.js文件,其中内容包括

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const {app, BrowserWindow,globalShortcut,ipcMain} =require('electron')
let win;
let windowConfig = {
  fullscreen:true,
  800,
  height:600
};
const  {autoUpdater}=require('electron-updater');
function createWindow(){
  win = new BrowserWindow(windowConfig);
  win.loadURL(`file://${__dirname}/index.html`);
  app.setApplicationMenu(null);//关闭菜单栏
  // 注册一个 'CommandOrControl+X' 的全局快捷键
  globalShortcut.register('CommandOrControl+Alt+K', () => {
    win.webContents.openDevTools();  //开启调试工具
  });
  win.on('close',() => {
    //回收BrowserWindow对象
    win = null;
  });
  win.on('resize',() => {
    win.reload();
  })
}
app.on('ready',createWindow);
app.on('window-all-closed',() => {
  app.quit();
});
app.on('activate',() => {
  if(win == null){
    createWindow();
  }
});
 
// 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
!function updateHandle() {
  let message = {
    error: '检查更新出错',
    checking: '正在检查更新……',
    updateAva: '检测到新版本,正在下载……',
    updateNotAva: '现在使用的就是最新版本,不用更新',
  };
  const uploadUrl = "更新包所在的服务器地址"// 下载地址,不加后面的**.exe
  autoUpdater.setFeedURL(uploadUrl);
  autoUpdater.on('error'function (error) {
    console.log(autoUpdater.error);
    sendUpdateMessage(message.error)
  });
  autoUpdater.on('checking-for-update'function () {
    sendUpdateMessage(message.checking)
  });
  autoUpdater.on('update-available'function (info) {
    sendUpdateMessage(message.updateAva)
  });
  autoUpdater.on('update-not-available'function (info) {
    sendUpdateMessage(message.updateNotAva)
  });
 
  // 更新下载进度事件
  autoUpdater.on('download-progress'function (progressObj) {
    win.webContents.send('downloadProgress', progressObj)
  });
  autoUpdater.on('update-downloaded'function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
 
    ipcMain.on('isUpdateNow', (e, arg) => {
      //some code here to handle event
      autoUpdater.quitAndInstall();
    });
 
    win.webContents.send('isUpdateNow')
  });
 
  ipcMain.on("checkForUpdate",()=>{
    //执行自动更新检查
    autoUpdater.checkForUpdates();
  })
}();
 
// 通过main进程发送事件给renderer进程,提示更新信息
function sendUpdateMessage(text) {
  win.webContents.send('message', text)
}

  在dist文件夹下新增package.json文件,其中包括内容为

       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "name""名称",
  "productName""项目名称",
  "author""作者",
  "version""1.1.1",//版本
  "main""main.js",
  "description""项目描述",
  "scripts": {
    "pack""electron-builder --dir",
    "dist""electron-builder",
    "postinstall""electron-builder install-app-deps"
  },
  "build": {
    "electronVersion""1.8.4",
    "win": {
      "requestedExecutionLevel""highestAvailable",
      "target": [
        {
          "target""nsis",
          "arch": [
            "x64"
          ]
        }
      ]
    },
    "appId""项目的id,唯一id",
    "artifactName""名称-${version}-${arch}.${ext}",
    "nsis": {
      "artifactName""名称-${version}-${arch}.${ext}"
    },
    "publish": [
      {
        "provider""generic",
        "url""服务器最新安装包的位置"
      }
    ]
  },
  "dependencies": {
    "core-js""^2.4.1",
    "electron-updater""^2.22.1",
    "fs-extra""^4.0.1",
    "install.js""^1.0.1",
    "moment""^2.18.1",
    "moment-es6""^1.0.0"
  }
}

  在你的vue项目里面App.vue生命周期里面新增如下代码:这是自动检测更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mounted: function () {
      if (window.require) {
        let ipc = window.require('electron').ipcRenderer;
        ipc.send("checkForUpdate");
        ipc.on("message", (event, text) => {
          this.tips = text;
          console.log('message1',this.tips)
        });
        ipc.on("downloadProgress", (event, progressObj)=> {
          this.downloadPercent = progressObj.percent || 0;
          console.log('message2',this.downloadPercent)
        });
        ipc.on("isUpdateNow", () => {
          ipc.send("isUpdateNow");
        });
      }
    },

 一切准备就绪之后在终端里面执行命令: electron-builder 

  成功之后会生成一个安装包及版本文件

     双击exe程序安装之后就在桌面有快捷图标就可以使用了,

如果你的程序有更新,一点要把你的安装包及latest.yml放到你刚刚在package.json里面更新文件在服务器的位置。

1
2
3
4
5
6
"publish": [
      {
        "provider""generic",
        "url""http:/xxxx.com/download/"
      }
    ]
1
download的文件下面,<br>注意有个坑:
1
http:/xxxx.com/download/latest.yml一定要能访问到并且在浏览器里面可以输出里面的内容,否则更新程序会失败。<br>文件目录如下:

如果真的不知道将来要做什么,索性就先做好眼前的事情。只要今天比昨天过得好,就是进步。长此以往,时间自然会还你一个意想不到的未来。
生活像一个杯子。一开始,里面是空的,之后,要看你怎么对待它。如果你只往不如意的方面想,那么你最终辉得到一杯苦水。如果你往好的方面想,那么你最终会得到一杯清泉。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文地址:https://www.cnblogs.com/lipengze/p/14898240.html