UNPKG

4.71 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const fs = require('fs-extra')
4const path = require('path')
5const program = require('commander')
6const chalk = require('chalk')
7
8const { keyConfigQuiet, filenameBuilding } = require('../defaults/before-build')
9
10const __ = require('../utils/translate')
11const sleep = require('../utils/sleep')
12const setEnvFromCommand = require('../utils/set-env-from-command')
13const getAppType = require('../utils/get-app-type')
14const validateConfig = require('../libs/validate-config')
15const validateConfigDist = require('../libs/validate-config-dist')
16const spinner = require('../utils/spinner')
17const initNodeEnv = require('../utils/init-node-env')
18const emptyTempConfigDir = require('../libs/empty-temp-config-dir')
19
20const kootBuild = require('../core/webpack/enter')
21
22program
23 .version(require('../package').version, '-v, --version')
24 .usage('[options]')
25 .option('-c, --client', 'Set STAGE to CLIENT')
26 .option('-s, --server', 'Set STAGE to SERVER')
27 .option('--stage <stage>', 'Set STAGE')
28 .option('--env <env>', 'Set ENV')
29 .option('--dest <destination-path>', 'Set destination directory')
30 .option('--config <config-file-path>', 'Set config file pathname')
31 .option('--type <project-type>', 'Set project type')
32 .option('--koot-dev', 'Koot dev mode')
33 .option('--koot-test', 'Koot test mode')
34 .parse(process.argv)
35
36/** 判断是否是通过 koot-start 命令启动
37 * @returns {Boolean}
38 */
39const isFromCommandStart = () => (process.env.KOOT_COMMAND_START && JSON.parse(process.env.KOOT_COMMAND_START))
40
41/**
42 * 执行打包
43 */
44const run = async () => {
45
46 const {
47 client, server,
48 stage: _stage,
49 env = 'prod',
50 config,
51 type,
52 dest,
53 kootDev = false,
54 kootTest = false,
55 } = program
56
57 initNodeEnv()
58 // console.log(program)
59
60 /** @type {Boolean} 是否为通过 koot-start 命令启动 */
61 const fromCommandStart = isFromCommandStart()
62 const fromOtherCommand = kootDev || fromCommandStart
63 if (!fromOtherCommand)
64 // 清空 log
65 process.stdout.write('\x1B[2J\x1B[0f')
66
67 setEnvFromCommand({
68 config,
69 type,
70 }, fromOtherCommand)
71
72 process.env.KOOT_TEST_MODE = JSON.stringify(kootTest)
73
74 const stage = (() => {
75 if (_stage) return _stage
76 if (client) return 'client'
77 if (server) return 'server'
78 return false
79 })()
80
81 // 在所有操作执行之前定义环境变量
82 process.env.WEBPACK_BUILD_STAGE = stage || 'client'
83 process.env.WEBPACK_BUILD_ENV = env
84
85 // 读取构建配置
86 const buildConfig = await validateConfig()
87 await getAppType()
88
89 if (dest) buildConfig.dist = validateConfigDist(dest)
90
91 // 如果通过 koot-start 命令启动...
92 if (fromCommandStart) {
93 // 非报错 log 不打出
94 buildConfig[keyConfigQuiet] = true
95 }
96
97 // 如果提供了 stage,仅针对 stage 执行打包
98 // SPA: 仅打包 client
99 if (process.env.WEBPACK_BUILD_TYPE === 'spa' || stage) {
100 // if (stage === 'server' && !hasServer) {
101 // console.log(chalk.redBright('× '))
102 // }
103 await kootBuild(buildConfig)
104 await after(buildConfig)
105 if (!fromCommandStart) console.log(' ')
106 return
107 }
108
109 // 如过没有提供 stage,自动相继打包 client 和 server
110 await kootBuild({ ...buildConfig })
111 await sleep(100)
112
113 // if (!hasServer) return
114
115 if (!fromCommandStart) console.log('\n' + ''.padEnd(60, '=') + '\n')
116 process.env.WEBPACK_BUILD_STAGE = 'server'
117 await kootBuild({ ...buildConfig })
118 await sleep(100)
119
120 if (!fromCommandStart) console.log('\n' + ''.padEnd(60, '=') + '\n')
121 if (!fromCommandStart) console.log(
122 chalk.green('√ ')
123 + chalk.yellowBright('[koot/build] ')
124 + __('build.complete', {
125 time: (new Date()).toLocaleString()
126 })
127 )
128
129 await after(buildConfig)
130 if (!fromCommandStart) console.log(' ')
131}
132
133const after = async (config = {}) => {
134 const ENV = process.env.WEBPACK_BUILD_ENV
135
136 const { dist } = config
137
138 // 移除临时配置文件
139 if (ENV === 'prod') emptyTempConfigDir()
140
141 // 移除标记文件
142 const fileBuilding = path.resolve(dist, filenameBuilding)
143
144 if (fs.existsSync(fileBuilding))
145 await fs.remove(fileBuilding)
146}
147
148run().catch(err => {
149 if (isFromCommandStart()) {
150 // throw err
151 return console.error(err)
152 }
153 spinner(chalk.yellowBright('[koot/build] ')).fail()
154 console.trace(err)
155})