深入浅出Electron:原理、工程与实践
上QQ阅读APP看书,第一时间看更新

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进程传递脚本数据。

所有这些工作执行完成后,开发者就会在自己指定的输出目录看到安装包的可执行文件。