UNPKG

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