This repository has been archived by the owner. It is now read-only.
Permalink
Cannot retrieve contributors at this time
137 lines (114 sloc)
3.34 KB
| /* eslint strict: 0, no-shadow: 0, no-unused-vars: 0, no-console: 0 */ | |
| 'use strict'; | |
| require('babel-polyfill'); | |
| const os = require('os'); | |
| const webpack = require('webpack'); | |
| const electronCfg = require('./webpack.config.electron'); | |
| const cfg = require('./webpack.config.production'); | |
| const packager = require('electron-packager'); | |
| const del = require('del'); | |
| const exec = require('child_process').exec; | |
| const argv = require('minimist')(process.argv.slice(2)); | |
| const pkg = require('./package.json'); | |
| const semver = require('semver'); | |
| const electronPrebuilt = require('electron-prebuilt'); | |
| const deps = Object.keys(pkg.dependencies); | |
| const devDeps = Object.keys(pkg.devDependencies); | |
| const appName = argv.name || argv.n || pkg.productName; | |
| const shouldUseAsar = argv.asar || argv.a || false; | |
| const shouldBuildAll = argv.all || false; | |
| const DEFAULT_OPTS = { | |
| dir: './', | |
| name: appName, | |
| asar: shouldUseAsar, | |
| ignore: [ | |
| '^/test($|/)', | |
| '^/release($|/)', | |
| '^/main.development.js' | |
| ].concat(devDeps.map(name => `/node_modules/${name}($|/)`)) | |
| .concat( | |
| deps.filter(name => !electronCfg.externals.includes(name)) | |
| .map(name => `/node_modules/${name}($|/)`) | |
| ) | |
| }; | |
| const icon = argv.icon || argv.i || 'logo/logo'; | |
| if (icon) { | |
| DEFAULT_OPTS.icon = icon; | |
| } | |
| const version = argv.version || argv.v; | |
| if (version) { | |
| DEFAULT_OPTS.version = version; | |
| startPack(); | |
| } else { | |
| // use the same version as the currently-installed electron-prebuilt | |
| exec(`${electronPrebuilt} --version`, (err, stdout) => { | |
| let electronVersion = semver.clean(stdout); | |
| if (err || !semver.valid(electronVersion)) { | |
| console.log('Unable to identify Electron version, falling back to v1.2.0.'); | |
| electronVersion = '1.2.0'; | |
| } | |
| DEFAULT_OPTS.version = electronVersion; | |
| startPack(); | |
| }); | |
| } | |
| function build(cfg) { | |
| return new Promise((resolve, reject) => { | |
| webpack(cfg, (err, stats) => { | |
| if (err) return reject(err); | |
| resolve(stats); | |
| }); | |
| }); | |
| } | |
| function startPack() { | |
| console.log('start pack...'); | |
| build(electronCfg) | |
| .then(() => build(cfg)) | |
| .then(() => del('release')) | |
| .then((paths) => { | |
| if (shouldBuildAll) { | |
| // build for all platforms | |
| const archs = ['ia32', 'x64']; | |
| const platforms = ['linux', 'win32', 'darwin']; | |
| platforms.forEach((plat) => { | |
| archs.forEach((arch) => { | |
| pack(plat, arch, log(plat, arch)); | |
| }); | |
| }); | |
| } else { | |
| // build for current platform only | |
| pack(os.platform(), os.arch(), log(os.platform(), os.arch())); | |
| } | |
| }) | |
| .catch((err) => { | |
| console.error(err); | |
| }); | |
| } | |
| function pack(plat, arch, cb) { | |
| // there is no darwin ia32 electron | |
| if (plat === 'darwin' && arch === 'ia32') return; | |
| const iconObj = { | |
| icon: DEFAULT_OPTS.icon + (() => { | |
| let extension = '.png'; | |
| if (plat === 'darwin') { | |
| extension = '.icns'; | |
| } else if (plat === 'win32') { | |
| extension = '.ico'; | |
| } | |
| return extension; | |
| })() | |
| }; | |
| const opts = Object.assign({}, DEFAULT_OPTS, iconObj, { | |
| platform: plat, | |
| arch, | |
| prune: true, | |
| 'app-version': pkg.version || DEFAULT_OPTS.version, | |
| out: `release/${plat}-${arch}` | |
| }); | |
| packager(opts, cb); | |
| } | |
| function log(plat, arch) { | |
| return (err, filepath) => { | |
| if (err) return console.error(err); | |
| console.log(`${plat}-${arch} finished!`); | |
| }; | |
| } |