mixone
Version:
A cross-platform desktop application framework that enables development using JavaScript, HTML5, Electron API and Node.js. Build Windows, macOS and Linux apps with Vue/React and system APIs - that's why we call it mixone.A powerful Electron development in
137 lines (130 loc) • 5.18 kB
JavaScript
const path = require('path');
const fs = require('fs');
const { spawn } = require('child_process');
// 获取工作目录
const cwd = process.cwd();
// 获取命令行参数
const [command, ...args] = process.argv.slice(2);
// 新增:支持多种版本号命令
const VERSION_COMMANDS = ['-v', '-V', '-version', 'version'];
if (VERSION_COMMANDS.includes(command)) {
// 读取 package.json 并输出 version
const pkgPath = path.join(__dirname, 'package.json');
try {
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
console.log(pkg.version);
} catch (e) {
console.error('无法读取版本号:', e.message);
process.exit(1);
}
process.exit(0);
}
// 支持的命令列表
const VALID_COMMANDS = ['create', 'compile', 'dev', 'serve', 'package', 'preview', 'build'];
// 检查命令是否有效
if (!command || !VALID_COMMANDS.includes(command)) {
console.log('请使用以下命令:');
console.log(' mixone create 创建项目');
console.log(' mixone compile 编译项目');
console.log(' mixone dev 启动开发模式');
console.log(' mixone serve 启动服务');
console.log(' mixone preview 预览应用');
console.log(' mixone package 打包应用');
console.log(' mixone build 构建项目');
console.log(' mixone -v 查看版本号');
process.exit(1);
}
// 构建命令文件路径
const commandFile = path.join(__dirname, `${command}.js`);
const byteCodeCli = path.join(__dirname,'node_modules','bytenode','lib','cli.js');
// 定义一个函数来使用 spawn 执行 serve.js
function runServeScript(cwd, args) {
console.log(cwd);
const serveProcess = spawn('node', [byteCodeCli,'serve.jsc', '--electron'], { stdio: 'inherit', cwd:path.join(cwd,'out') });
serveProcess.on('close', (code) => {
if (code !== 0) {
console.error(`serve.js 进程退出,退出码: ${code}`);
process.exit(code);
}
});
}
// 执行对应的命令
try {
if (command === 'dev') {
// 使用 spawn 调用 node 执行 compile.js
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'compile.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`compile.js 进程退出,退出码: ${code}`);
process.exit(code);
} else {
console.log('------------------------');
// 调用独立的函数来执行 serve.js
runServeScript(cwd, args);
}
});
} else if(command == 'compile') {
// 使用 spawn 调用 node 执行 compile.js
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'compile.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`compile.js 进程退出,退出码: ${code}`);
process.exit(code);
} else {
console.log('编译完成');
}
});
} else if(command == 'serve') {
runServeScript(cwd, args);
} else if(command == 'preview') {
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'preview.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`preview.js 进程退出,退出码: ${code}`);
process.exit(code);
}
});
} else if(command == 'package') {
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'package.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`package.js 进程退出,退出码: ${code}`);
process.exit(code);
}
});
} else if(command == 'build') {
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'build.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`build.js 进程退出,退出码: ${code}`);
process.exit(code);
}
});
} else if(command == 'create'){
// 获取项目名称(第一个参数)
const projectName = args[0] + path.sep + 'out' || 'electron-app' + path.sep + 'out';
// 构建项目路径
const projectPath = path.join(cwd, projectName);
// 使用 spawn 调用 node 执行 compile.js
const compileProcess = spawn('node', [byteCodeCli, path.join(__dirname, 'project.jsc'), ...args], { stdio: 'inherit' });
compileProcess.on('close', (code) => {
if (code !== 0) {
console.error(`project.js 进程退出,退出码: ${code}`);
process.exit(code);
} else {
console.log('------------------------');
}
});
} else {
// 检查命令文件是否存在
if (!fs.existsSync(commandFile)) {
console.error(`错误: 命令 "${command}" 对应的文件不存在`);
process.exit(1);
}
require(commandFile);
}
} catch (err) {
console.error(`执行命令 "${command}" 时出错:`, err);
process.exit(1);
}