UNPKG

node-karin

Version:

Lightweight, efficient, concise, and stable robot framework.

612 lines (607 loc) 24.1 kB
#!/usr/bin/env node 'use strict'; var fs2 = require('fs'); var url = require('url'); var path2 = require('path'); var child_process = require('child_process'); var dotenv = require('dotenv'); var commander = require('commander'); var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null; function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var fs2__default = /*#__PURE__*/_interopDefault(fs2); var path2__default = /*#__PURE__*/_interopDefault(path2); var dotenv__default = /*#__PURE__*/_interopDefault(dotenv); var execSync = (cmd, options = {}) => { try { const result = child_process.execSync(cmd, options); return { status: true, error: null, stdout: result.toString(), stderr: "" }; } catch (error) { return { status: false, error, stdout: "", stderr: "" }; } }; var exec = (cmd, options = {}) => { return new Promise((resolve) => { child_process.exec(cmd, options, (error, stdout, stderr) => { const status = !error; resolve({ status, error, stdout, stderr }); }); }); }; var pm2Dir = path2__default.default.join(process.cwd(), "./@karinjs/config/pm2.json"); var start = () => { if (!fs2__default.default.existsSync(pm2Dir)) { console.log(`[pm2] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728 \u8BF7\u68C0\u67E5 ${pm2Dir} \u662F\u5426\u5B58\u5728`); console.log("[pm2] \u5982\u679C\u662F\u65B0\u9879\u76EE\uFF0C\u8BF7\u5148\u524D\u53F0\u542F\u52A8\u751F\u6210\u914D\u7F6E\u6587\u4EF6: pnpm app"); process.exit(1); } console.log("[pm2] \u542F\u52A8\u4E2D..."); const data = JSON.parse(fs2__default.default.readFileSync(pm2Dir, "utf-8")); const script = "./node_modules/node-karin/dist/cli/pm2.js"; if (data.apps[0].script !== script) { data.apps[0].script = script; fs2__default.default.writeFileSync(pm2Dir, JSON.stringify(data, null, 2)); } const { error } = execSync(`pm2 start ${pm2Dir}`, { cwd: process.cwd() }); if (error) { console.log("[pm2] \u542F\u52A8\u5931\u8D25"); console.log(error); process.exit(1); } console.log("[pm2] \u542F\u52A8\u6210\u529F"); console.log("[pm2] \u91CD\u542F\u670D\u52A1: pnpm rs"); console.log("[pm2] \u67E5\u770B\u65E5\u5FD7: pnpm log"); console.log("[pm2] \u505C\u6B62\u670D\u52A1: pnpm stop"); console.log("[pm2] \u67E5\u770B\u76D1\u63A7: pm2 monit"); console.log("[pm2] \u67E5\u770B\u5217\u8868: pm2 list"); process.exit(0); }; var log = () => { if (!fs2__default.default.existsSync(pm2Dir)) { console.log(`[pm2] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728 \u8BF7\u68C0\u67E5 ${pm2Dir} \u662F\u5426\u5B58\u5728`); console.log("[pm2] \u5982\u679C\u662F\u65B0\u9879\u76EE\uFF0C\u8BF7\u5148\u524D\u53F0\u542F\u52A8\u751F\u6210\u914D\u7F6E\u6587\u4EF6: pnpm app"); process.exit(1); } const data = JSON.parse(fs2__default.default.readFileSync(pm2Dir, "utf-8")); try { const prefix = process.platform === "win32" ? "pm2.cmd" : "pm2"; child_process.spawn(prefix, ["logs", data.apps[0].name, "--lines", data.lines || 1e3], { stdio: "inherit", shell: true }); } catch (error) { console.error("[pm2] \u53D1\u751F\u672A\u77E5\u9519\u8BEF: \u8BF7\u68C0\u67E5pm2\u662F\u5426\u5B89\u88C5 \u3010npm install -g pm2\u3011"); console.error(error); process.exit(1); } }; var stop = () => { if (!fs2__default.default.existsSync(pm2Dir)) { console.log(`[pm2] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728 \u8BF7\u68C0\u67E5 ${pm2Dir} \u662F\u5426\u5B58\u5728`); console.log("[pm2] \u5982\u679C\u662F\u65B0\u9879\u76EE\uFF0C\u8BF7\u5148\u524D\u53F0\u542F\u52A8\u751F\u6210\u914D\u7F6E\u6587\u4EF6: pnpm app"); process.exit(1); } const data = JSON.parse(fs2__default.default.readFileSync(pm2Dir, "utf-8")); execSync(`pm2 stop ${data.apps[0].name}`, { cwd: process.cwd() }); console.log("[pm2] \u505C\u6B62\u6210\u529F"); process.exit(0); }; var restart = () => { console.log("[pm2] \u91CD\u542F\u4E2D..."); if (!fs2__default.default.existsSync(pm2Dir)) { console.log(`[pm2] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728 \u8BF7\u68C0\u67E5 ${pm2Dir} \u662F\u5426\u5B58\u5728`); console.log("[pm2] \u5982\u679C\u662F\u65B0\u9879\u76EE\uFF0C\u8BF7\u5148\u524D\u53F0\u542F\u52A8\u751F\u6210\u914D\u7F6E\u6587\u4EF6: pnpm app"); process.exit(1); } execSync(`pm2 restart ${pm2Dir}`, { cwd: process.cwd() }); console.log("[pm2] \u91CD\u542F\u6210\u529F"); process.exit(0); }; var pm2 = { start, log, stop, restart }; var isDev = false; var dir = process.env.INIT_CWD || process.cwd(); var pkgDir = url.fileURLToPath(new url.URL("../..", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))); var isPluginDev = () => { const pkg = fs2__default.default.readFileSync(path2__default.default.join(dir, "package.json"), "utf-8"); const data = JSON.parse(pkg); if (data == null ? void 0 : data.karin) return true; if (fs2__default.default.existsSync(path2__default.default.join(dir, "src"))) return true; if (fs2__default.default.existsSync(path2__default.default.join(dir, "tsconfig.json"))) return true; if (fs2__default.default.existsSync(path2__default.default.join(dir, ".prettierrc"))) return true; if (fs2__default.default.existsSync(path2__default.default.join(dir, "eslint.config.mjs"))) return true; return false; }; var createDir = () => { const list = [ path2__default.default.join(dir, "@karinjs", "logs"), path2__default.default.join(dir, "@karinjs", "config"), path2__default.default.join(dir, "@karinjs", "data"), path2__default.default.join(dir, "@karinjs", "resource"), path2__default.default.join(dir, "@karinjs", "temp", "console"), path2__default.default.join(dir, "@karinjs", "temp", "html") ]; !isDev && list.push(path2__default.default.join(dir, "plugins", "karin-plugin-example")); list.forEach((item) => { if (!fs2__default.default.existsSync(item)) fs2__default.default.mkdirSync(item, { recursive: true }); }); }; var createPnpmFile = (dir2) => { const pnpmfile = path2__default.default.join(dir2, ".pnpmfile.cjs"); if (fs2__default.default.existsSync(pnpmfile)) return; const content = [ "// \u6E05\u7A7A\u5BF9\u7B49\u4F9D\u8D56\u4E2D\u7684node-karin", "function readPackage (pkg, context) {", " if (pkg?.['peerDependencies']?.['node-karin'] && pkg['peerDependencies']['node-karin'] !== 'file:./lib') {", " delete pkg['peerDependencies']['node-karin']", " }", " return pkg", "}", "module.exports = {", " hooks: {", " readPackage", " },", "}" ].join("\n"); fs2__default.default.writeFileSync(pnpmfile, content); }; var shouldSkipNpmrc = () => { const { stdout } = execSync("npm config get registry"); if (stdout.includes("registry.npmjs.org")) return true; const { stdout: proxy } = execSync("npm config get proxy"); return !!proxy; }; var createOrUpdateNpmrc = (dir2) => { const list = [ "node_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/sqlite3", "better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3", "sass_binary_site=https://registry.npmmirror.com/-/binary/node-sass", "sharp_binary_host=https://registry.npmmirror.com/-/binary/sharp", "sharp_libvips_binary_host=https://registry.npmmirror.com/-/binary/sharp-libvips", "canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas", "# 19\u4EE5\u4E0B\u7248\u672C", "puppeteer_download_host=https://registry.npmmirror.com/mirrors", "# 20\u4EE5\u4E0A\u7248\u672C", "PUPPETEER_DOWNLOAD_BASE_URL = https://registry.npmmirror.com/binaries/chrome-for-testing" ]; const npmrc = path2__default.default.join(dir2, ".npmrc"); if (!fs2__default.default.existsSync(npmrc)) { fs2__default.default.writeFileSync(npmrc, list.join("\n")); return; } const data = fs2__default.default.readFileSync(npmrc, "utf-8"); const newEntries = list.filter((item) => { const key = item.split("=")[0]; return !data.includes(key); }); if (newEntries.length > 0) { fs2__default.default.appendFileSync(npmrc, "\n" + newEntries.join("\n")); } }; var createOrUpdateEnv = (dir2) => { const generateRandomKey = () => { const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return Array.from( { length: 6 }, () => chars.charAt(Math.floor(Math.random() * chars.length)) ).join(""); }; const envData = [ "# \u662F\u5426\u542F\u7528HTTP", "HTTP_ENABLE=true", "# HTTP\u76D1\u542C\u7AEF\u53E3", "HTTP_PORT=7777", "# HTTP\u76D1\u542C\u5730\u5740", "HTTP_HOST=0.0.0.0", "# HTTP\u9274\u6743\u79D8\u94A5 \u4EC5\u7528\u4E8Ekarin\u81EA\u8EABApi", `HTTP_AUTH_KEY=${generateRandomKey()}`, "# ws_server\u9274\u6743\u79D8\u94A5", `WS_SERVER_AUTH_KEY=${generateRandomKey()}`, "\n", "# \u662F\u5426\u542F\u7528Redis \u5173\u95ED\u540E\u5C06\u4F7F\u7528\u5185\u90E8\u865A\u62DFRedis", "REDIS_ENABLE=true", "# \u91CD\u542F\u662F\u5426\u8C03\u7528pm2 \u5982\u679C\u4E0D\u8C03\u7528\u5219\u4F1A\u76F4\u63A5\u5173\u673A \u6B64\u914D\u7F6E\u9002\u5408\u6709\u8FDB\u7A0B\u5B88\u62A4\u7684\u7A0B\u5E8F", "PM2_RESTART=true", "\n", "# \u65E5\u5FD7\u7B49\u7EA7", "LOG_LEVEL=info", "# \u65E5\u5FD7\u4FDD\u7559\u5929\u6570", "LOG_DAYS_TO_KEEP=7", "# \u65E5\u5FD7\u6587\u4EF6\u6700\u5927\u5927\u5C0F \u5982\u679C\u6B64\u9879\u5927\u4E8E0\u5219\u542F\u7528\u65E5\u5FD7\u5206\u5272", "LOG_MAX_LOG_SIZE=0", "# logger.fnc\u989C\u8272", 'LOG_FNC_COLOR="#E1D919"', "# \u65E5\u5FD7\u5B9E\u65F6Api\u6700\u591A\u652F\u6301\u540C\u65F6\u8FDE\u63A5\u6570", "LOG_API_MAX_CONNECTIONS=5", "\n", "# ffmpeg", "FFMPEG_PATH=", "# ffprobe", "FFPROBE_PATH=", "# ffplay", "FFPLAY_PATH=", "\n", "# \u8FD9\u91CC\u8BF7\u52FF\u4FEE\u6539", "RUNTIME=node" ]; const env = path2__default.default.join(dir2, ".env"); if (!fs2__default.default.existsSync(env)) { fs2__default.default.writeFileSync(env, envData.join("\n")); return; } const value = fs2__default.default.readFileSync(env, "utf-8"); const newEntries = envData.filter((item) => { if (item.includes("#")) return false; const key = item.split("=")[0]; return !value.includes(key); }); if (newEntries.length > 0) { fs2__default.default.appendFileSync(env, "\n" + newEntries.join("\n")); } }; var createWorkspace = (dir2) => { const workspace = path2__default.default.join(dir2, "pnpm-workspace.yaml"); if (fs2__default.default.existsSync(workspace)) return; const content = "packages:\n - 'plugins/**'\n"; fs2__default.default.writeFileSync(workspace, content); }; var createOtherFile = async () => { !isDev && createPnpmFile(dir); !isDev && createWorkspace(dir); if (!shouldSkipNpmrc()) { createOrUpdateNpmrc(dir); } createOrUpdateEnv(dir); }; var createConfig = () => { const defCfg = path2__default.default.join(pkgDir, "default", "config"); const files = fs2__default.default.readdirSync(defCfg); files.forEach((file) => { if (!file.endsWith(".json")) return; const filePath = path2__default.default.join(defCfg, file); const targetPath = path2__default.default.join(dir, "@karinjs", "config"); const targetFile = path2__default.default.join(targetPath, file); if (!fs2__default.default.existsSync(targetFile)) { fs2__default.default.copyFileSync(filePath, targetFile); return; } const defData = fs2__default.default.readFileSync(filePath, "utf-8"); const targetData = fs2__default.default.readFileSync(targetFile, "utf-8"); const mergedData = { ...JSON.parse(defData), ...JSON.parse(targetData) }; fs2__default.default.writeFileSync(targetFile, JSON.stringify(mergedData, null, 2)); }); }; var modifyPackageJson = async () => { const pkg = fs2__default.default.readFileSync(path2__default.default.join(dir, "package.json"), "utf-8"); const data = JSON.parse(pkg); data.type = "module"; if (!data.scripts) data.scripts = {}; data.scripts.karin = "karin"; const { stdout: pnpmVersion } = execSync("pnpm -v"); const majorVersion = parseInt(pnpmVersion.split(".")[0]); if (majorVersion < 10 && data.pnpm) { delete data.pnpm; } else if (majorVersion >= 10) { if (typeof data.pnpm !== "object") data.pnpm = {}; data.pnpm.onlyBuiltDependenciesFile = [ "sqlite3", "classic-level" ]; } const list = ["app", "start", "pm2", "stop", "rs", "log"]; if (!isDev) { list.forEach((v) => { data.scripts[v] = `karin ${v}`; }); } fs2__default.default.writeFileSync(path2__default.default.join(dir, "package.json"), JSON.stringify(data, null, 2)); return data; }; var init = async () => { isDev = isPluginDev(); createDir(); await createOtherFile(); createConfig(); await modifyPackageJson(); process.exit(0); }; var parseEnvFiles = (env) => { if (!env) return [".env"]; return env.split(",").map((file) => file.trim()); }; var loadEnv = (env) => { const dir2 = process.cwd(); const files = parseEnvFiles(env); if (!files.includes(".env")) { files.unshift(".env"); } files.forEach((file) => { if (!fs2__default.default.existsSync(`${dir2}/${file}`)) { if (file === ".env") { console.error(`\u672A\u627E\u5230${file}\u6587\u4EF6\uFF0C\u8BF7\u4F7F\u7528 npx karin init \u8FDB\u884C\u521D\u59CB\u5316\u9879\u76EE`); } else { console.error(`\u672A\u627E\u5230${file}\u6587\u4EF6\uFF0C\u8BF7\u5C06\u5176\u653E\u7F6E\u5728\u9879\u76EE\u6839\u76EE\u5F55`); } process.exit(1); } }); const paths = files.map((file) => `${dir2}/${file}`); dotenv__default.default.config({ path: paths, override: true }); }; var start2 = async (env) => { loadEnv(env); const index = "../root.js"; const { karinMain } = await import(index); const child = child_process.fork(karinMain); child.on("message", (message) => { if (message === "restart") { child.kill(); child.removeAllListeners(); start2(env); } }); child.on("exit", (code) => process.exit(code)); }; var checkGitInstalled = async () => { try { const { status } = await exec("git --version"); return status; } catch { return false; } }; var sortUpdateItems = (items) => { return [...items].sort((a, b) => { if (a.isPlugin !== b.isPlugin) { return a.isPlugin ? 1 : -1; } if (a.needUpdate !== b.needUpdate) { return a.needUpdate ? 1 : -1; } return a.name.localeCompare(b.name); }); }; var updateAll = async () => { try { console.log("\u5F00\u59CB\u6267\u884C\u66F4\u65B0\u4EFB\u52A1\n"); const allItems = []; const packagesToUpdate = []; await Promise.all([ // 检查npm依赖 checkDependencies("./package.json", allItems, packagesToUpdate), // 检查git插件 checkPlugins("./plugins", allItems) ]); const sortedItems = sortUpdateItems(allItems); if (sortedItems.length > 0) { console.log("\u68C0\u67E5\u7ED3\u679C:"); const tableData = sortedItems.map((item) => { return { name: item.name, type: item.type, currentVersion: item.currentVersion, latestVersion: item.latestVersion, status: item.status }; }); console.table(tableData); } else { console.log("\u6CA1\u6709\u627E\u5230\u9700\u8981\u68C0\u67E5\u7684\u9879\u76EE"); } if (packagesToUpdate.length > 0) { console.log("\n\u5F00\u59CB\u66F4\u65B0\u5305:"); try { const { status, error } = await exec(`pnpm update ${packagesToUpdate.join(" ")} --save`); if (status) { console.log("npm\u5305\u66F4\u65B0\u5B8C\u6210"); const updatedItems = sortedItems.filter((item) => item.needUpdate); if (updatedItems.length > 0) { console.log("\n\u5DF2\u66F4\u65B0\u7684\u9879\u76EE:"); const updatedTable = updatedItems.map((item) => ({ name: item.name, type: item.type, from: item.currentVersion, to: item.latestVersion })); console.table(updatedTable); } } else { console.error("npm\u5305\u66F4\u65B0\u5931\u8D25:", error); } } catch (error) { console.error("npm\u5305\u66F4\u65B0\u5931\u8D25:", error); } } console.log("\n\u66F4\u65B0\u4EFB\u52A1\u6267\u884C\u5B8C\u6210"); } finally { process.exit(0); } }; var checkDependencies = async (packagePath, allItems, packagesToUpdate) => { try { const packageJson = JSON.parse(fs2__default.default.readFileSync(packagePath, "utf-8")); const dependencies = packageJson.dependencies || {}; const checkVersionTasks = Object.entries(dependencies).map(async ([pkg, version]) => { if (pkg.startsWith("@types/")) { return; } try { const { stdout: pkgInfoStr } = await exec(`pnpm view ${pkg} --json`); const pkgInfo = JSON.parse(pkgInfoStr.trim()); if (!pkgInfo.karin && pkg !== "node-karin") return; const currentVersion = version.replace(/[\^~]/g, ""); const { stdout: distTagsStr } = await exec(`pnpm view ${pkg} dist-tags --json`); const distTags = JSON.parse(distTagsStr.trim()); const isPreRelease = /[-+]/.test(currentVersion); const latestVersion = distTags.latest; const needUpdate = isPreRelease || currentVersion !== latestVersion; if (needUpdate) { packagesToUpdate.push(`${pkg}@latest`); allItems.push({ name: pkg, type: "npm", currentVersion: `${currentVersion}${isPreRelease ? " (\u9884\u53D1\u5E03)" : ""}`, latestVersion, status: `${currentVersion} -> ${latestVersion}`, needUpdate: true, isPlugin: true }); } else { allItems.push({ name: pkg, type: "npm", currentVersion, latestVersion, status: "\u5DF2\u662F\u6700\u65B0", needUpdate: false, isPlugin: true }); } } catch (error) { console.error(`\u68C0\u67E5 ${pkg} \u7248\u672C\u5931\u8D25:`, error); } }); await Promise.all(checkVersionTasks); } catch (error) { console.error("\u66F4\u65B0\u4F9D\u8D56\u5931\u8D25:", error); } }; var checkPlugins = async (pluginsPath, allItems) => { if (!await checkGitInstalled()) { console.error("\u8BF7\u5148\u5B89\u88C5git"); return; } if (!fs2__default.default.existsSync(pluginsPath)) { console.error("plugins\u76EE\u5F55\u4E0D\u5B58\u5728"); return; } const isDirectory = (await fs2__default.default.promises.stat(pluginsPath)).isDirectory(); if (!isDirectory) { console.error("plugins\u8DEF\u5F84\u4E0D\u662F\u4E00\u4E2A\u76EE\u5F55"); return; } const dirs = await fs2__default.default.promises.readdir(pluginsPath); const updateTasks = dirs.map(async (dir2) => { const pluginPath = path2.join(pluginsPath, dir2); const gitPath = path2.join(pluginPath, ".git"); const packageJsonPath = path2.join(pluginPath, "package.json"); if (!dir2.startsWith("karin-plugin-") || !(await fs2__default.default.promises.stat(pluginPath)).isDirectory()) { return; } if (!fs2__default.default.existsSync(gitPath)) { allItems.push({ name: dir2, type: "git", currentVersion: "-", latestVersion: "-", status: "\u4E0D\u662Fgit\u4ED3\u5E93\uFF0C\u5DF2\u8DF3\u8FC7", needUpdate: false, isPlugin: false }); return; } try { const packageJson = JSON.parse(fs2__default.default.readFileSync(packageJsonPath, "utf-8")); if (!packageJson.karin) { allItems.push({ name: dir2, type: "git", currentVersion: "-", latestVersion: "-", status: "\u975EKarin\u63D2\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7", needUpdate: false, isPlugin: false }); return; } const { status, stdout, error } = await exec("git pull", { cwd: pluginPath }); const isUpToDate = stdout.includes("Already up to date") || stdout.includes("\u5DF2\u7ECF\u662F\u6700\u65B0\u7684"); const currentVersion = packageJson.version || "-"; if (!status) { allItems.push({ name: dir2, type: "git", currentVersion, latestVersion: "-", status: `\u66F4\u65B0\u5931\u8D25: ${error}`, needUpdate: false, isPlugin: true }); } else if (isUpToDate) { allItems.push({ name: dir2, type: "git", currentVersion, latestVersion: currentVersion, status: "\u5DF2\u662F\u6700\u65B0", needUpdate: false, isPlugin: true }); } else { try { const updatedPackageJson = JSON.parse(fs2__default.default.readFileSync(packageJsonPath, "utf-8")); const updatedVersion = updatedPackageJson.version || "\u5DF2\u66F4\u65B0"; allItems.push({ name: dir2, type: "git", currentVersion, latestVersion: updatedVersion, status: `${currentVersion} -> ${updatedVersion}`, needUpdate: true, isPlugin: true }); } catch { allItems.push({ name: dir2, type: "git", currentVersion, latestVersion: "\u5DF2\u66F4\u65B0", status: "\u66F4\u65B0\u6210\u529F", needUpdate: true, isPlugin: true }); } } } catch (error) { allItems.push({ name: dir2, type: "git", currentVersion: "-", latestVersion: "-", status: `\u5904\u7406\u5931\u8D25: ${error}`, needUpdate: false, isPlugin: false }); } }); await Promise.all(updateTasks); }; var _a; if (!((_a = process.argv) == null ? void 0 : _a[2])) process.argv.push("-h"); var addEnvOption = (command) => { return command.option("-e, --env <files>", "\u6307\u5B9A\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\uFF0C\u591A\u4E2A\u6587\u4EF6\u7528\u9017\u53F7\u5206\u9694"); }; var getVersion = () => { try { const file = url.fileURLToPath(new URL("../../package.json", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))); const packageJson = JSON.parse(fs2__default.default.readFileSync(file, "utf-8")); return packageJson.version; } catch { return "unknown"; } }; commander.program.version(getVersion(), "-v, --version", "\u663E\u793A\u7248\u672C\u53F7"); commander.program.command("pm2").description("\u540E\u53F0\u8FD0\u884C").action(pm2.start); commander.program.command("stop").description("\u505C\u6B62\u540E\u53F0\u8FD0\u884C").action(pm2.stop); commander.program.command("rs").description("\u91CD\u542Fpm2\u670D\u52A1").action(pm2.restart); commander.program.command("log").description("\u67E5\u770B\u65E5\u5FD7").action(pm2.log); commander.program.command("up").description("\u66F4\u65B0\u63D2\u4EF6").action(updateAll); commander.program.command("init").description("\u521D\u59CB\u5316\u9879\u76EE").action(init); addEnvOption(commander.program.command(".").description("\u524D\u53F0\u542F\u52A8")).action( (options) => start2(options.env) ); addEnvOption(commander.program.command("app").description("\u524D\u53F0\u542F\u52A8")).action( (options) => start2(options.env) ); addEnvOption(commander.program.command("start").description("\u524D\u53F0\u542F\u52A8")); commander.program.parse(process.argv);