-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuild.js
More file actions
350 lines (294 loc) · 9.27 KB
/
Copy pathbuild.js
File metadata and controls
350 lines (294 loc) · 9.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
/**
* 打包脚本
* 用于将应用打包成可执行文件
*/
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// 确保pkg已安装
function ensurePkgInstalled() {
try {
console.log('检查pkg是否已安装...');
execSync('npx pkg --version', { stdio: 'ignore' });
console.log('✅ pkg已安装');
return true;
} catch (error) {
console.log('⚠️ pkg未安装,正在安装...');
try {
execSync('npm install -g pkg', { stdio: 'inherit' });
console.log('✅ pkg安装成功');
return true;
} catch (installError) {
console.error('❌ pkg安装失败:', installError.message);
return false;
}
}
}
// 创建打包配置
function createPackageConfig() {
console.log('正在更新package.json配置...');
try {
const packageJsonPath = path.join(__dirname, 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
// 添加pkg配置
packageJson.bin = {
'multi-api': './src/index.js',
'clean-privacy': './clean-privacy.js'
};
packageJson.pkg = {
assets: [
'public/**/*',
'node_modules/**/*',
'src/**/*'
],
targets: [
'node16-win-x64'
]
// 移除outputPath,使exe文件直接生成在根目录
};
// 添加打包脚本
packageJson.scripts = packageJson.scripts || {};
packageJson.scripts.build = 'node build.js';
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
console.log('✅ package.json更新成功');
return true;
} catch (error) {
console.error('❌ 更新package.json失败:', error.message);
return false;
}
}
// 创建必要目录
function createDistDir() {
// 创建Multi-API主目录
const distDir = path.join(__dirname, 'Multi-API');
if (!fs.existsSync(distDir)) {
fs.mkdirSync(distDir, { recursive: true });
console.log('✅ 创建Multi-API目录成功');
}
// 创建data目录
const dataDir = path.join(distDir, 'data');
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
console.log('✅ 创建data目录成功');
}
// 创建debug_logs目录
const debugLogsDir = path.join(dataDir, 'debug_logs');
if (!fs.existsSync(debugLogsDir)) {
fs.mkdirSync(debugLogsDir, { recursive: true });
console.log('✅ 创建debug_logs目录成功');
}
// 创建backups目录
const backupsDir = path.join(distDir, 'backups');
if (!fs.existsSync(backupsDir)) {
fs.mkdirSync(backupsDir, { recursive: true });
console.log('✅ 创建backups目录成功');
}
}
// 打包主程序
function buildMainApp() {
console.log('正在打包主程序...');
try {
execSync('npx pkg . --target node16-win-x64 --output Multi-API/Multi-API.exe', { stdio: 'inherit' });
console.log('✅ 主程序打包成功');
return true;
} catch (error) {
console.error('❌ 主程序打包失败:', error.message);
return false;
}
}
// 打包清理工具
function buildCleanTool() {
console.log('正在打包清理工具...');
try {
execSync('npx pkg clean-privacy.js --target node16-win-x64 --output Multi-API/Clean-Privacy.exe', { stdio: 'inherit' });
console.log('✅ 清理工具打包成功');
return true;
} catch (error) {
console.error('❌ 清理工具打包失败:', error.message);
return false;
}
}
// 复制必要文件
function copyNecessaryFiles() {
console.log('正在复制必要文件...');
// 复制.env文件
try {
fs.copyFileSync(
path.join(__dirname, '.env'),
path.join(__dirname, 'Multi-API', '.env.example')
);
console.log('✅ 复制.env文件成功');
} catch (error) {
console.error('❌ 复制.env文件失败:', error.message);
}
// 创建空的db.json文件
try {
const emptyDb = {
apiConfigs: [],
activeConfig: null
};
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'data', 'db.json'),
JSON.stringify(emptyDb, null, 2)
);
console.log('✅ 创建空的db.json文件成功');
} catch (error) {
console.error('❌ 创建空的db.json文件失败:', error.message);
}
// 复制public文件夹
try {
const publicSrcDir = path.join(__dirname, 'public');
const publicDestDir = path.join(__dirname, 'Multi-API', 'public');
fs.cpSync(publicSrcDir, publicDestDir, { recursive: true });
console.log('✅ 复制public文件夹成功');
} catch (error) {
console.error('❌ 复制public文件夹失败:', error.message);
}
// 复制src文件夹
try {
const srcSrcDir = path.join(__dirname, 'src');
const srcDestDir = path.join(__dirname, 'Multi-API', 'src');
fs.cpSync(srcSrcDir, srcDestDir, { recursive: true });
console.log('✅ 复制src文件夹成功');
} catch (error) {
console.error('❌ 复制src文件夹失败:', error.message);
}
console.log('✅ 必要文件复制完成');
return true;
}
// 创建启动脚本
function createStartScript() {
console.log('正在创建启动脚本...');
// 创建Linux/macOS启动脚本
const startShContent = `#!/bin/bash
echo "正在启动Multi-API服务..."
# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )"
# 根据操作系统类型执行不同的启动命令
if [[ "$OSTYPE" == "darwin"* ]] || [[ "$OSTYPE" == "linux-gnu"* ]]; then
# macOS或Linux系统
"$SCRIPT_DIR/Multi-API.exe"
else
# Windows系统
start "" "$SCRIPT_DIR\\Multi-API.exe"
fi
`;
// 创建Windows启动脚本
const startBatContent = `@echo off
echo 正在启动Multi-API服务...
start "" "%~dp0Multi-API.exe"
`;
try {
// 写入Linux/macOS启动脚本
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'start.sh'),
startShContent
);
// 写入Windows启动脚本
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'start.bat'),
startBatContent
);
console.log('✅ 创建启动脚本成功');
return true;
} catch (error) {
console.error('❌ 创建启动脚本失败:', error.message);
return false;
}
}
// 创建隐私数据清理脚本
function createCleanPrivacyScript() {
console.log('正在创建隐私数据清理脚本...');
// 创建Linux/macOS清理脚本
const cleanPrivacyShContent = `#!/bin/bash
echo "正在启动隐私数据清理工具..."
# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )"
# 执行清理工具
"$SCRIPT_DIR/Clean-Privacy.exe"
`;
// 创建Windows清理脚本
const cleanPrivacyBatContent = `@echo off
echo 正在启动隐私数据清理工具...
"%~dp0Clean-Privacy.exe"
`;
try {
// 写入Linux/macOS清理脚本
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'clean-privacy.sh'),
cleanPrivacyShContent
);
// 写入Windows清理脚本
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'clean-privacy.bat'),
cleanPrivacyBatContent
);
console.log('✅ 创建隐私数据清理脚本成功');
return true;
} catch (error) {
console.error('❌ 创建隐私数据清理脚本失败:', error.message);
return false;
}
}
// 创建README文件
function createReadme() {
console.log('正在创建README文件...');
const readmeContent = `# Multi-API 应用
## 使用说明
1. 在Linux/macOS系统上,执行 ./start.sh 启动Multi-API服务;在Windows系统上,双击 start.bat 或执行 start.bat
2. 打开浏览器访问 http://localhost:3000 使用应用
3. 如需清理隐私数据,在Linux/macOS系统上执行 ./clean-privacy.sh;在Windows系统上,双击 clean-privacy.bat 或执行 clean-privacy.bat
## 文件说明
- Multi-API.exe: 主程序
- Clean-Privacy.exe: 隐私数据清理工具
- start.sh: 启动脚本
- start.bat: Windows启动脚本
- clean-privacy.sh: 隐私数据清理脚本
- clean-privacy.bat: Windows隐私数据清理脚本
- data/db.json: 数据库文件
- backups/: 备份目录
- public/: 静态资源目录
- src/: 源代码目录
`;
try {
fs.writeFileSync(
path.join(__dirname, 'Multi-API', 'README.txt'),
readmeContent
);
console.log('✅ 创建README文件成功');
return true;
} catch (error) {
console.error('❌ 创建README文件失败:', error.message);
return false;
}
}
// 主函数
async function main() {
console.log('===== 开始打包Multi-API应用 =====');
if (!ensurePkgInstalled()) {
console.error('❌ pkg安装失败,打包过程终止');
return;
}
if (!createPackageConfig()) {
console.error('❌ 配置更新失败,打包过程终止');
return;
}
createDistDir();
const mainAppBuilt = buildMainApp();
const cleanToolBuilt = buildCleanTool();
if (mainAppBuilt && cleanToolBuilt) {
copyNecessaryFiles();
createStartScript();
createCleanPrivacyScript();
createReadme();
console.log('\n===== 打包完成 =====');
console.log('打包文件位于: ' + path.join(__dirname, 'Multi-API'));
console.log('可以将根目录中的可执行文件和相关脚本复制到任意位置使用');
} else {
console.error('❌ 打包过程中出现错误,请检查上述日志');
}
}
// 执行主函数
main().catch(error => {
console.error('打包过程出错:', error);
});