Electron实战:创建ELectron开发的window应用安装包

本文介绍如何使用 Squirrel 工具在 Windows 平台上为 Electron 应用创建 .exe 安装包,并实现应用的自动更新、快捷方式创建等功能。

转载地址:http://blog.youkuaiyun.com/w342916053/article/details/51323634

前言:研究electron自动更新的时候,在electron的官方文档auto-updater 中,提到了在几个平台macLinuxwindowselectron 的自动更新方法,其中windsow平台上面,文章中建议先用grunt-electron-installer 模块来创建windows安装包,grunt这个工具是由Squirrel集成的。进而了解下Squirrel这个工具, 一个可以用来给electron应用的安装更新卸载添加快捷方式的工具。本文主要提及如何在windows平台下,用Squirrel创建electron.exe安装包。

 

创建nuget

我们的方法是使用nuget工具创建Nuget包,再使用Squirrel工具创建.exe

1.下载squirrel.exenuget.exe,也可以选择直接安装Squirrel.Windows (需要有vitual studio环境)。

 

2.新建文件夹如my-build,把下载好的squirrel.exenuget.exesetup.exe

放进去,在文件夹放入我们未打包的electron应用,如下图:

 

 

4.my-build根目录中,打开命令行执行nuget spec

如下图:


生成 spec包初始文件


5.编辑器打开 Package.nuspec,按照自己项目的需要编辑这个文件,如下图:

 

这里需要注意:根据Squirrel文档说明,target folder 属性需要设置为lib/net45,否则并没有用;<iconUrl>标签用来制定未来的exeicon

5.用下面的命令创建一个nuget包,

nuget pack Package.nuspec

如下图:


之后在目录中会出现这个包


命名规则就是<my_app_name>.<version>.nupkg

 

创建安装程序

 

把应用程序打包成nuget包之后,就可以用squirrel创建一个安装程序了。在根目录打开命令行,执行以下命令:

squirrel --releasify <my_app_name>.<version>.nupkg


这个时候命令行中没有任何提示。但是别慌,编译一段时间后程序会创建一个release文件夹,里面有三个文件,nuget包,RELEASES 文件和安装文件Setup.exe。如下图:


如果没有出现这三个文件,可以查看目录中的SquirrelSetup.log,根据里面的报错,来进行调试。

注意上面这条squirrel 命令,可以用来设置setup.exe在安装过程中用传统icon还是用自定义的图片文件。使用Squirrel --help可以查看更多帮助

 

发布应用和安装应用

把上一步生成的setup.exe发送给想要安装这个应用的用户,就可以了。

最终应用会被安装在C:\Users\Administrator\AppData\Local\[appname] 文件夹中,注意Squirrel 的日志文件也存在目录中,调试安装问题的时候非常有用。

双击我们的setup.exe进行安装app测试,如果中途有任何出错,在

C:\Users\Administrator\AppData\Local\SquirrelTemp 里面可以看到安装日志。如下图:


 

安装之后打开C:\Users\Administrator\AppData\Local 目录,可以看到app安装在这里,如下图:


自动创建快捷方式

进入我们安装之后的文件夹,命令行进入C:\Users\Administrator\AppData\Local\[your appname],执行 Update.exe --help ,可以看到


 

不知道从上图你有没有得到什么提示,反正我发现了,在命令行手动创建快捷方式的命令是Update.exe --createshortcut electron\electron.exe -i  [your ico toute]\app.ico

所以,如果我们想让应用在安装过程中静默地创建好快捷方式,那就需要在app的安装之后相反设法执行这句代码。

因为我们的.exe会在安装之后自动打开程序,所以我在程序的入口main.js,添加sqruieel事件的监听就好了。如下图:


我顺便把程序卸载时,删除快捷方式的监听事件也写了进去。还有程序的更新和删除事件监听,但是这两个事件,我还没有进行测试。

更新应用

其实我一直很想做增量更新,在这里我的更新方法有两个,第一是在程序的入口添加js,发送请求到服务器,拉取更改文件进行本地替换,但是如果是node_module依赖包的更改,这个方法并不可行。第二个方法比较安全而且快捷通过发布一个版本号不同的exe,如下:1.在这个创建安装程序的步骤2中,我们把程序代码都复制到了这个文件夹里面,如下图:


 

如果后续我们的程序要进行更新,首先我们需要把更改的文件直接复制替换到这个文件夹。

2.打开Package.nuspec,编辑version标签


 

3.参考本文种中创建安装程序部分的步骤2-4,重新生成setup.exe,发布应用。

 

通过执行setip.exe安装,程序会自动删除之前的应用,但是我并不清楚,sqruieel 是进行了增量替换,还是将之前的整个应用进行删除,再重新安装。

创建自定义安装包

在上一步,我们已经把自己的exe发布出来了,但是如果没有自定义名字跟icon,好像还不够酷,所以我们需要创建自定义的安装文件。

1.下载安装 Resource Hacker

2.打开这个项目目录,在electron.exe上面右键


出现菜单,点击 Open using Rescource Hacker

3.Resource Hacker应用运行之后中,在以下界面中选择Icon,然后在工具栏里面选择ActionReplace Icon,如下图:


 

然后选择自己想要替换的.ico文件就好

 

4.这其实并不够,我们还需要更换exe里面的版本信息,打开Version Info,把FileDescriptionProductName改成我们自己的项目名称,最好把SquirrelAwareVersion也更改一下,毕竟是版本号。


5.做完这些之后,我们需要按照之前的步骤,在命令行中输入

nuget pack Package.nuspec

重新生成nuget包,然后再使用

 squirrel --releasify <my_app_name>.<version>.nupkg 命令创建安装文件。

6.打开之后生成的releases文件夹,参考本文种中创建安装程序部分的步骤2-4,对setup.exe进行自定义。


 

最后,一个可以自动更新又安装便捷,还有我们自己的酷酷的图标跟名字的应用就生成拉!

<think>我们正在创建一个基于Vue3和Electron的项目,并且需要集成SerialPort。由于Electron环境与普通浏览器环境不同,它允许我们使用Node.js的模块,但是直接在前端代码中使用SerialPort可能会遇到问题,因为Electron有主进程和渲染进程的区别。通常,我们应该在主进程中使用SerialPort,然后通过进程间通信(IPC)与渲染进程(Vue组件)进行交互。 步骤概览: 1. 创建Vue3项目 2. 集成Electron 3. 安装SerialPort 4. 在主进程中设置SerialPort 5. 通过IPC暴露接口给渲染进程 6. 在Vue组件中使用IPC与主进程通信 详细步骤: 1. 创建Vue3项目 使用Vue CLI创建项目,如果你没有安装Vue CLI,可以先安装: ```bash npm install -g @vue/cli ``` 然后创建项目: ```bash vue create vue-electron-serial ``` 选择Vue3。 2. 集成Electron 我们可以使用`vue-cli-plugin-electron-builder`插件来集成Electron。 在项目目录下运行: ```bash vue add electron-builder ``` 选择最新版本(如`electron^13.0.0`或更高,但注意SerialPort可能需要特定的Node版本,因此需要确保Electron内置的Node版本与SerialPort兼容)。 3. 安装SerialPort 注意:SerialPort是原生模块,需要编译。因此,我们需要确保系统有编译环境(比如Python和node-gyp)。同时,我们需要为Electron重新编译SerialPort,因为Electron使用的Node.js版本与系统安装的Node.js版本不同。 首先,安装SerialPort: ```bash npm install serialport ``` 然后,为Electron重新编译: ```bash npm install electron-rebuild --save-dev ``` 在`package.json`中添加脚本: ```json "scripts": { ..., "postinstall": "electron-rebuild" } ``` 这样,每次安装包后都会重新编译原生模块。 注意:如果遇到编译问题,可能需要检查node版本、electron版本以及serialport版本之间的兼容性。 4. 在主进程中设置SerialPort 在Electron中,主进程文件默认是`background.js`(由`vue-cli-plugin-electron-builder`生成)。我们需要在这里引入SerialPort,并设置IPC通信。 首先,在`background.js`中引入SerialPort和IPC模块: ```javascript import { app, protocol, BrowserWindow, ipcMain } from 'electron' import SerialPort from 'serialport' ``` 然后,我们可以创建一个函数来列出串口,例如: ```javascript ipcMain.handle('get-ports', async (event) => { return SerialPort.list() }) ``` 另外,我们可能还需要打开串口、关闭串口、读写数据等,这些都需要通过IPC暴露接口。 5. 在Vue组件中使用IPC与主进程通信 在Vue组件中,我们可以使用`window.electron`(由`vue-cli-plugin-electron-builder`自动暴露)或者直接使用`import { ipcRenderer } from 'electron'`(但注意在渲染进程中,默认情况下不能直接使用Node模块,需要根据Electron的配置决定)。不过,`vue-cli-plugin-electron-builder`为我们提供了一个安全的预加载脚本,我们可以通过预加载脚本将IPC方法暴露给渲染进程。 修改`background.js`,在创建窗口时指定预加载脚本: ```javascript const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), // 预加载脚本 nodeIntegration: false, // 不建议开启,安全原因 contextIsolation: true, // 默认开启,确保安全 enableRemoteModule: false // 关闭remote模块 } }) ``` 然后,在预加载脚本(`preload.js`)中暴露IPC方法: ```javascript const { ipcRenderer } = require('electron') window.electron = { getPorts: () => ipcRenderer.invoke('get-ports') } ``` 这样,在Vue组件中,我们就可以通过`window.electron.getPorts()`来调用主进程的方法了。 6. 在Vue组件中使用 例如,在Vue组件的`mounted`钩子中获取串口列表: ```javascript mounted() { if (window.electron) { window.electron.getPorts().then(ports => { console.log(ports) this.ports = ports }) } } ``` 注意事项: - 由于SerialPort是原生模块,不同平台(Windows、macOS、Linux)可能需要不同的编译工具链。 -Windows上,可能需要安装Windows Build Tools(以管理员身份运行PowerShell:`npm install --global windows-build-tools`)。 - 在macOS上,可能需要安装Xcode命令行工具:`xcode-select --install`。 - 在Linux上,可能需要安装build-essential等。 以上步骤是一个基本的集成过程。根据实际需求,你可能还需要实现打开串口、读取数据、发送数据等功能,这些都可以通过类似的方式(在主进程处理,通过IPC通信)来实现。 现在,我们可以启动项目: ```bash npm run electron:serve ``` 如果一切正常,Electron窗口将会打开,并且可以获取串口列表。 注意:由于SerialPort的安装和编译可能比较复杂,如果遇到问题,请检查错误信息,通常与编译环境或版本不匹配有关。 相关问题: 1. 如何解决SerialPort在Electron中编译失败的问题? 2. 如何在Electron的主进程和渲染进程之间安全地通信? 3. 如何实现串口数据的实时传输并在Vue组件中显示? 4. 如何打包这个Vue-Electron应用,使得它可以在不同平台上运行?</think>### 创建 Vue3 + Electron + SerialPort 项目的完整指南 #### 步骤 1:创建 Vue3 项目 ```bash npm install -g @vue/cli vue create vue-electron-serial # 选择 Vue3 + TypeScript 模板 cd vue-electron-serial ``` #### 步骤 2:集成 Electron ```bash vue add electron-builder # 选择最新稳定版 Electron(如 Electron 26) ``` #### 步骤 3:安装 SerialPort 依赖 ```bash npm install serialport npm install --save-dev @types/serialport electron-rebuild ``` #### 步骤 4:配置原生模块支持 1. 在 `package.json` 中添加重建脚本: ```json "scripts": { "postinstall": "electron-rebuild" } ``` 2. 创建 `.npmrc` 文件指定构建目标: ```ini runtime = electron target = 26.0.0 # 需与安装的Electron版本一致 ``` #### 步骤 5:主进程通信设置 1. 在 `background.js` 中添加 IPC 处理: ```javascript const { ipcMain } = require('electron') const SerialPort = require('serialport') // 获取串口列表 ipcMain.handle('get-ports', async () => { return SerialPort.list() }) // 打开串口 ipcMain.handle('open-port', (_, path) => { return new SerialPort(path, { baudRate: 9600 }) }) ``` 2. 创建预加载脚本 `src/preload.js`: ```javascript const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('serialAPI', { getPorts: () => ipcRenderer.invoke('get-ports'), openPort: (path) => ipcRenderer.invoke('open-port', path) }) ``` 3. 修改 `background.js` 中 BrowserWindow 配置: ```javascript mainWindow = new BrowserWindow({ webPreferences: { preload: path.join(__dirname, 'preload.js') // 添加此行 } }) ``` #### 步骤 6:在 Vue 组件中使用 SerialPort ```vue <script setup> import { ref, onMounted } from 'vue' const ports = ref([]) onMounted(async () => { ports.value = await window.serialAPI.getPorts() }) const connectToPort = async (path) => { const port = await window.serialAPI.openPort(path) port.on('data', data => { console.log('Received:', data.toString()) }) } </script> <template> <div> <h2>可用串口设备</h2> <ul> <li v-for="port in ports" :key="port.path"> {{ port.path }} - {{ port.manufacturer }} <button @click="connectToPort(port.path)">连接</button> </li> </ul> </div> </template> ``` #### 步骤 7:解决常见问题 1. **原生模块编译问题**: ```bash # 安装构建工具 npm install --global windows-build-tools # Windows sudo apt-get install build-essential # Ubuntu brew install cmake # macOS ``` 2. **跨域资源限制**: 在 `vue.config.js` 中添加: ```javascript module.exports = { pluginOptions: { electronBuilder: { nodeIntegration: false, contextIsolation: true } } } ``` #### 步骤 8:运行和构建 ```bash # 开发模式 npm run electron:serve # 生产构建 npm run electron:build ``` ### 注意事项 1. SerialPort 操作必须在主进程执行,通过 IPC 与渲染进程通信 2. Windows 系统需要安装 [CP210x USB驱动](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers) 3. Linux 用户需将当前用户加入 `dialout` 组: ```bash sudo usermod -a -G dialout $USER ``` ### 示例项目结构 ``` ├── src │ ├── background.js # Electron主进程 │ ├── preload.js # 安全通信脚本 │ └── components │ └── SerialPort.vue # 串口组件 ├── package.json ├── vue.config.js └── .npmrc ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值