build.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. 'use strict'
  2. process.env.NODE_ENV = 'production'
  3. const { say } = require('cfonts')
  4. const chalk = require('chalk')
  5. const del = require('del')
  6. const packager = require('electron-packager')
  7. const webpack = require('webpack')
  8. const Multispinner = require('multispinner')
  9. const buildConfig = require('./build.config')
  10. const mainConfig = require('./webpack.main.config')
  11. const rendererConfig = require('./webpack.renderer.config')
  12. const webConfig = require('./webpack.web.config')
  13. const doneLog = chalk.bgGreen.white(' DONE ') + ' '
  14. const errorLog = chalk.bgRed.white(' ERROR ') + ' '
  15. const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
  16. const isCI = process.env.CI || false
  17. if (process.env.BUILD_TARGET === 'clean') clean()
  18. else if (process.env.BUILD_TARGET === 'web') web()
  19. else build()
  20. function clean () {
  21. del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
  22. console.log(`\n${doneLog}\n`)
  23. process.exit()
  24. }
  25. function build () {
  26. greeting()
  27. del.sync(['dist/electron/*', '!.gitkeep'])
  28. const tasks = ['main', 'renderer']
  29. const m = new Multispinner(tasks, {
  30. preText: 'building',
  31. postText: 'process'
  32. })
  33. let results = ''
  34. m.on('success', () => {
  35. process.stdout.write('\x1B[2J\x1B[0f')
  36. console.log(`\n\n${results}`)
  37. console.log(`${okayLog}take it away ${chalk.yellow('`electron-packager`')}\n`)
  38. bundleApp()
  39. })
  40. pack(mainConfig).then(result => {
  41. results += result + '\n\n'
  42. m.success('main')
  43. }).catch(err => {
  44. m.error('main')
  45. console.log(`\n ${errorLog}failed to build main process`)
  46. console.error(`\n${err}\n`)
  47. process.exit(1)
  48. })
  49. pack(rendererConfig).then(result => {
  50. results += result + '\n\n'
  51. m.success('renderer')
  52. }).catch(err => {
  53. m.error('renderer')
  54. console.log(`\n ${errorLog}failed to build renderer process`)
  55. console.error(`\n${err}\n`)
  56. process.exit(1)
  57. })
  58. }
  59. function pack (config) {
  60. return new Promise((resolve, reject) => {
  61. config.mode = 'production'
  62. webpack(config, (err, stats) => {
  63. if (err) reject(err.stack || err)
  64. else if (stats.hasErrors()) {
  65. let err = ''
  66. stats.toString({
  67. chunks: false,
  68. colors: true
  69. })
  70. .split(/\r?\n/)
  71. .forEach(line => {
  72. err += ` ${line}\n`
  73. })
  74. reject(err)
  75. } else {
  76. resolve(stats.toString({
  77. chunks: false,
  78. colors: true
  79. }))
  80. }
  81. })
  82. })
  83. }
  84. function bundleApp () {
  85. buildConfig.mode = 'production'
  86. packager(buildConfig, (err, appPaths) => {
  87. if (err) {
  88. console.log(`\n${errorLog}${chalk.yellow('`electron-packager`')} says...\n`)
  89. console.log(err + '\n')
  90. } else {
  91. console.log(`\n${doneLog}\n`)
  92. }
  93. })
  94. }
  95. function web () {
  96. del.sync(['dist/web/*', '!.gitkeep'])
  97. webConfig.mode = 'production'
  98. webpack(webConfig, (err, stats) => {
  99. if (err || stats.hasErrors()) console.log(err)
  100. console.log(stats.toString({
  101. chunks: false,
  102. colors: true
  103. }))
  104. process.exit()
  105. })
  106. }
  107. function greeting () {
  108. const cols = process.stdout.columns
  109. let text = ''
  110. if (cols > 85) text = 'lets-build'
  111. else if (cols > 60) text = 'lets-|build'
  112. else text = false
  113. if (text && !isCI) {
  114. say(text, {
  115. colors: ['yellow'],
  116. font: 'simple3d',
  117. space: false
  118. })
  119. } else console.log(chalk.yellow.bold('\n lets-build'))
  120. console.log()
  121. }