3.9 生成安装包
首先electron-builder并没有使用NSIS提供的压缩功能,而是自己调用了7z压缩工具来完成压缩工作,这个工具是以一个依赖包的形式存放在开发者的工程目录下的,实际路径为:
D:\project\base\yourProject\node_modules\7zip-bin\win\x64\7za.exe
使用此工具的逻辑代码如下:
zipFiles() { return new Promise((resolve, reject) => { execFile( this.sevenZipPath, [ 'a', '-bd', '-mx=9', '-md=1m', '-mtc=off', '-ms=off', '-mtm=off', '-mta=off', path.join(process.cwd(), 'release/yourApp-1.3.6-ia32.nsis.7z'), ], { maxBuffer: 1000 * 1024 * 1024, cwd: path.join(process.cwd(), 'release/win-ia32-unpacked'), }, (error, stdout, stderr) => { if (error == null) { resolve() } else { console.log(error) reject() } } ) }) },
上述代码通过Node.js的execFile方法来调用7za.exe,并为其传递了一系列与压缩工作有关的控制参数。最后通过cwd来设置进程执行的工作目录win-ia32-unpacked,这样7za.exe就会把该目录下的所有内容打包到yourAppName-1.3.6-ia32.nsis.7z文件内。
打包工作完成后,electron-builder通过Node.js的spawn方法启动了NSIS内置的makensis工具,其所在的路径如下:
C:\Users\yourUserName\AppData\Local\electron-builder\Cache\nsis\nsis-3.0.4.1\Bin\makensis.exe
并通过一系列的控制参数使其生成安装包,前面生成的7z压缩包是通过-DAPP_32参数传递给makensis.exe的。由于其参数实在太多,这里就不一一列举了。
值得一提的是,electron-builder分两步生成应用程序的安装包,第一步先生成卸载应用程序的可执行文件,第二步再生成安装程序的可执行文件,electron-builder之所以多此一举,主要是为了满足开发者为卸载应用程序的可执行文件签名的需求。
electron-builder为了便捷地控制NSIS生成安装包的过程,预先编写了很多nsi脚本。这些脚本存放的路径如下:
D:\project\base\yourProject\node_modules\app-builder-lib\templates\nsis
electron-builder会自动根据用户的配置组织这些脚本,并把最终得到的脚本代码通过命令行的标准输入接口传递给makensis进程,为此electron-builder特地封装了Node.js的spawn方法,代码如下所示(为了方便理解,代码做了改动):
doSpawn(target, args, param, input) { return new Promise((resolve, reject) => { let subProcess = spawn(target, args, param) subProcess.once('close', (code) => { if (code === 0) { resolve(true) } else { console.log('doSpawn error', code) reject(false) } }) if (input) { subProcess.stdin.end(input) } }) }
调用此方法时,param参数的stdio属性需设置为pipe,这样才能通过命令行的标准输入为makensis进程传递脚本数据。
所有这些工作执行完成后,开发者就会在自己指定的输出目录看到安装包的可执行文件。