UNPKG

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