build.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. 'use strict'
  2. const Multispinner = require('multispinner');
  3. process.env.NODE_ENV = 'production'
  4. const { say } = require('cfonts')
  5. const chalk = require('chalk')
  6. const del = require('del')
  7. const { spawn } = require('child_process')
  8. const webpack = require('webpack')
  9. const Listr = require('listr')
  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. async function build () {
  26. greeting()
  27. del.sync(['dist/electron/*', '!.gitkeep'])
  28. const task = ['main', 'renderer']
  29. const m = new Multispinner(task, {
  30. preText: 'building',
  31. postText: 'process'
  32. })
  33. let results = ''
  34. const tasks = new Listr(
  35. [
  36. {
  37. title: 'building master process',
  38. task: async () => {
  39. await pack(mainConfig)
  40. .then(result => {
  41. results += result + '\n\n'
  42. })
  43. .catch(err => {
  44. console.log(`\n ${errorLog}failed to build main process`)
  45. console.error(`\n${err}\n`)
  46. })
  47. }
  48. },
  49. {
  50. title: 'building renderer process',
  51. task: async () => {
  52. await pack(rendererConfig)
  53. .then(result => {
  54. results += result + '\n\n'
  55. })
  56. .catch(err => {
  57. console.log(`\n ${errorLog}failed to build renderer process`)
  58. console.error(`\n${err}\n`)
  59. })
  60. }
  61. }
  62. ],
  63. { concurrent: 2 }
  64. )
  65. await tasks
  66. .run()
  67. .then(() => {
  68. process.stdout.write('\x1B[2J\x1B[0f')
  69. console.log(`\n\n${results}`)
  70. console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
  71. process.exit()
  72. })
  73. .catch(err => {
  74. process.exit(1)
  75. })
  76. }
  77. function pack (config) {
  78. return new Promise((resolve, reject) => {
  79. config.mode = 'production'
  80. webpack(config, (err, stats) => {
  81. if (err) reject(err.stack || err)
  82. else if (stats.hasErrors()) {
  83. let err = ''
  84. stats.toString({
  85. chunks: false,
  86. colors: true
  87. })
  88. .split(/\r?\n/)
  89. .forEach(line => {
  90. err += ` ${line}\n`
  91. })
  92. reject(err)
  93. } else {
  94. resolve(stats.toString({
  95. chunks: false,
  96. colors: true
  97. }))
  98. }
  99. })
  100. })
  101. }
  102. function web () {
  103. del.sync(['dist/web/*', '!.gitkeep'])
  104. webConfig.mode = 'production'
  105. webpack(webConfig, (err, stats) => {
  106. if (err || stats.hasErrors()) console.log(err)
  107. console.log(stats.toString({
  108. chunks: false,
  109. colors: true
  110. }))
  111. process.exit()
  112. })
  113. }
  114. function greeting () {
  115. const cols = process.stdout.columns
  116. let text = ''
  117. if (cols > 85) text = 'lets-build'
  118. else if (cols > 60) text = 'lets-|build'
  119. else text = false
  120. if (text && !isCI) {
  121. say(text, {
  122. colors: ['yellow'],
  123. font: 'simple3d',
  124. space: false
  125. })
  126. } else console.log(chalk.yellow.bold('\n lets-build'))
  127. console.log()
  128. }