UNPKG

tiny-runtime-injector

Version:

A library that helps you download complete, lightweight runtime environments like Node.js, Bun, and uv. It's useful for including minimal runtimes when building applications like Electron.

119 lines (118 loc) 5.39 kB
#!/usr/bin/env node import { program } from "commander"; import { RuntimeInjector } from "./index.js"; import fs from "fs-extra"; import path from "path"; import { fileURLToPath } from "url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); program .name("tiny-runtime-injector") .description("下载并配置最小化的运行时环境 (Node.js, Bun, uv)") .version("1.0.0") .option("-t, --type <type>", "运行时类型 (node, bun, uv)", "node") .option("-r, --runtime-version <version>", "运行时版本 (例如: v22.9.0 for node, v1.2.16 for bun, 0.7.13 for uv)") .option("-d, --dir <directory>", "目标目录", "./runtime") .option("-p, --platform <platform>", "目标平台") .option("-a, --arch <architecture>", "目标架构") .option("-c, --config <config>", "配置文件路径") .option("--no-cleanup", "禁用清理功能 (仅对 Node.js 有效)") .option("--no-docs", "保留文档文件 (仅对 Node.js 有效)") .option("--no-dev", "保留开发文件 (仅对 Node.js 有效)") .option("--no-sourcemaps", "保留源码映射文件 (仅对 Node.js 有效)") .option("--custom-rules <rules>", "自定义清理规则 (JSON 字符串, 仅对 Node.js 有效)") .parse(); const options = program.opts(); async function main() { try { let config = {}; // Validate runtime type const validTypes = ["node", "bun", "uv"]; if (!validTypes.includes(options.type)) { console.error(`错误: 不支持的运行时类型 "${options.type}". 支持的类型: ${validTypes.join(", ")}`); process.exit(1); } // Set default directory based on runtime type const defaultDir = options.dir === "./runtime" ? `./runtime/${options.type}` : options.dir; // 如果指定了配置文件,则读取配置 if (options.config) { const configPath = path.resolve(process.cwd(), options.config); if (await fs.pathExists(configPath)) { config = await fs.readJson(configPath); } else { console.error(`配置文件不存在: ${configPath}`); process.exit(1); } } // Display runtime-specific help if (options.type === "node") { console.log("正在安装 Node.js 运行时..."); console.log("默认版本: v22.9.0"); console.log("支持清理选项以减小运行时大小"); } else if (options.type === "bun") { console.log("正在安装 Bun 运行时..."); console.log("默认版本: v1.2.16"); console.log("将安装单个 bun 可执行文件"); } else if (options.type === "uv") { console.log("正在安装 uv 运行时..."); console.log("默认版本: 0.7.13"); console.log("将安装 uv 和 uvx 可执行文件"); } // 合并命令行参数和配置文件 const runtimeOptions = { ...config, type: options.type, version: options.runtimeVersion, targetDir: defaultDir, platform: options.platform, arch: options.arch, cleanup: options.cleanup ? { removeDocs: options.docs, removeDevFiles: options.dev, removeSourceMaps: options.sourcemaps, customRules: options.customRules ? JSON.parse(options.customRules) : undefined, } : false, }; const injector = new RuntimeInjector(runtimeOptions); await injector.inject(); console.log("安装完成!"); // Display post-installation info if (options.type === "node") { console.log(`Node.js 可执行文件位置: ${path.join(defaultDir, process.platform === "win32" ? "node.exe" : "bin/node")}`); } else if (options.type === "bun") { console.log(`Bun 可执行文件位置: ${path.join(defaultDir, process.platform === "win32" ? "bun.exe" : "bun")}`); } else if (options.type === "uv") { console.log(`uv 可执行文件位置: ${path.join(defaultDir, process.platform === "win32" ? "uv.exe" : "uv")}`); console.log(`uvx 可执行文件位置: ${path.join(defaultDir, process.platform === "win32" ? "uvx.exe" : "uvx")}`); } } catch (error) { console.error("安装失败:", error); process.exit(1); } } // Add examples to help program.on("--help", () => { console.log(""); console.log("使用示例:"); console.log(" $ tiny-runtime-injector --type node --runtime-version v22.9.0 --dir ./runtime/node"); console.log(" $ tiny-runtime-injector --type bun --runtime-version v1.2.16 --dir ./runtime/bun"); console.log(" $ tiny-runtime-injector --type uv --runtime-version 0.7.13 --dir ./runtime/uv"); console.log(""); console.log("支持的运行时:"); console.log(" node - Node.js JavaScript运行时"); console.log(" bun - Bun JavaScript运行时和工具包"); console.log(" uv - Python包管理器和解释器管理工具"); console.log(""); }); // 直接执行主函数 main();