経緯

electron にて ビルドするのに electron-builder を使用してみた
その際に最低限 Lint, UnitTest を通ることを担保するようにしたため備忘録として残しておく

構築環境

electron: 5.0.1
electron-builder: 20.39.0

実際のコード

package.json に以下の定義がしてある前提 ※以下は electron x angular(Angular Cli で生成)

{
  ・・・
  "scripts": {
    "ng": "ng",
    "start": "ng build --prod && electron .",
    "build": "ng build",
    "test": "jest",
    "lint": "ng lint",
    "postinstall": "electron-builder install-app-deps",
    "release": "ng build --prod && node build.js",
  },
  ・・・
}

electron-builder のオプションについては公式を参照

'use strict';

const builder = require('electron-builder');
const Platform = builder.Platform;

const childProcess = require('child_process');

const unitTest = new Promise((resolve, reject) => {
  childProcess.exec('yarn test', (error, stdout) => {
    if (error) {
      // エラー時は例外を投げる
      reject(new Error(stdout + error));
    }
    resolve('UnitTest OK!');
  });
});

const lint = new Promise((resolve, reject) => {
  childProcess.exec('yarn lint', (error, stdout) => {
    if (error) {
      // エラー時は例外を投げる
      reject(new Error(stdout + error));
    }
    resolve('Lint OK!');
  });
});

const build = () => {
  builder
    .build({
      targets: Platform.WINDOWS.createTarget(),
      config: {
        directories: {
          output: 'release',
          buildResources: 'dist',
        },
        productName: 'Example App',
        files: ['**/*', 'dist/**/*'],
        win: {
          target: [
            {
              target: 'nsis',
              arch: ['x64'],
            },
          ],
        },
        nsis: {
          createDesktopShortcut: 'always',
        },
      },
    })
    .then(() => {
      console.log('Build OK!');
    })
    .catch((error) => {
      console.log(error);
    });
};

Promise.all([lint, unitTest])
  .then((values) => {
    console.log(values.join('\n'));
    build();
  })
  .catch((error) => {
    console.log(error.message);
  });