美文网首页
初探交互式命令行

初探交互式命令行

作者: 说叁两事 | 来源:发表于2021-01-24 23:49 被阅读0次

Node原生实现命令行

function cli () {
  process.on('exit', function () {
    console.log('----exit')
  })
  process.stdin.setEncoding('utf8')
  process.stdout.write('......\n')
  console.log('----------------00000000000------------')
  process.stdout.write('确认执行吗(y/n)?')
  process.stdout.write('......\n')
  process.stdin.on('data', (input) => {
    input = input.toString().trim()
    if (['Y', 'y', 'YES', 'yes'].indexOf(input) > -1) {
      console.log('success')
    }
    if (['N', 'n', 'No', 'no'].indexOf(input) > -1) {
      console.log('reject')
    }
    console.log('===========callback============')
    process.exit(0)
  })
}
cli()

巨人肩膀上的命令行实现

在前人的基础上,自定义交互脚本是一个很简单的事情。

这里介绍四个工具,分别作用在不同的领域:

  • shelljs
    • 执行脚本程序
  • inquirer
    • 命令行用户交互界面
  • chalk
    • 命令行日志样式
    • 可嵌套、可链式
  • commander
    • 自定义命令行参数
// const spawn = require('child_process').spawn
// const { Command } = require('commander')
const shell = require('shelljs');
const inquirer = require('inquirer');
const chalk = require('chalk');
const scriptsConfig = require('../config/scripts')
const runModes = require('../config/modes')

// const program = new Command();
let curScriptEvent = process.env.npm_lifecycle_event;  // E.g.:'npm run serve'中的'serve'
let curScriptSource = process.env.npm_lifecycle_script;  // E.g.:'npm run serve: vue-cli-service serve'的'vue-cli-service serve'


const build = async () => {
  let res;
  try {
    // j、k或者数字键选择
    res = await inquirer.prompt([
      {
        type: 'list',
        name: 'operation',
        message: '请选择你要运行的命令:npm run',
        choices: ['serve', 'build', 'push', 'fds', 'test']
      },
      {
        type: 'list',
        name: 'mode',
        message: '请选择你要执行的环境?',
        choices: ['dev', 'prev', 'pro']
      },
    ]);
  } catch(e) {
    if (e.isTryError) {
      console.log(chalk.red("Prompt couldn't be rendered in the current environment"))
    } else {
      console.log(chalk.red("Error:", e))
    }
  }
  const { operation, mode } = res;
  console.log(chalk.green(`正在执行操作npm run ${operation}---${mode}......`));
  curScriptEvent = `${operation}${mode ? (':' + mode) : ''}`
  curScriptSource = scriptsConfig[curScriptEvent]

  if (process.platform === 'win32') {
    shell.exec(`npx cross-env ${curScriptSource}`)
    // spawn('npx cross-env', [curScriptSource], {
    //   stdio: 'inherit',
    //   shell: true
    // })
  } else {
    shell.exec(`npm run ${curScriptEvent}`)
    // spawn('npm', ['run', curScriptEvent])
  }
}
build();


优化版:

const shell = require('shelljs');
// const spawn = require('child_process').spawn;
const inquirer = require('inquirer');
const chalk = require('chalk');
const { scripts, getRunModes } = require('../config/scripts')
const runModes = getRunModes(scripts)
const operationKeys = Object.keys(runModes)

let curScriptEvent = process.env.npm_lifecycle_event;  // E.g.:'npm run serve'中的'serve'
let curScriptSource = process.env.npm_lifecycle_script; // E.g.:'npm run serve: vue-cli-service serve'的'vue-cli-service serve'

const build = async () => {
  let operation, mode;
  try {
    // j、k或者数字键选择
    const res = await inquirer.prompt({
      type: 'list',
      name: 'operation',
      message: '请选择你要运行的命令:npm run',
      choices: operationKeys
    });
    operation = res.operation
  } catch(e) {
    if (e.isTryError) {
      console.log(chalk.red("Prompt couldn't be rendered in the current environment"))
    } else {
      console.log(chalk.red("Error:", e))
    }
  }
  try {
    // j、k或者数字键选择
    const res = await inquirer.prompt({
      type: 'list',
      name: 'mode',
      message: '请选择你要执行的环境?',
      choices: runModes[operation]
    });
    mode = res.mode
  } catch(e) {
    if (e.isTryError) {
      console.log(chalk.red("Prompt couldn't be rendered in the current environment"))
    } else {
      console.log(chalk.red("Error:", e))
    }
  }
  // const { operation, mode } = res;
  // const NODE_ENV = runModes[mode];
  curScriptEvent = `${operation}${mode ? (':' + mode) : ''}`
  curScriptSource = scripts[curScriptEvent]
  console.log(chalk.green(`正在执行${curScriptSource}......`));

  if (process.platform === 'win32') {
    // spawn('npx cross-env', [curScriptSource], {
    //   stdio: 'inherit',
    //   shell: true
    // })
    shell.exec(`npx cross-env ${curScriptSource}`)
  } else {
    shell.exec(curScriptSource)
    // spawn('npm', ['run', curScriptEvent], {
    //   stdio: 'inherit',
    //   shell: true
    // })
  }
}
build();

相关文章

  • 初探交互式命令行

    Node原生实现命令行 巨人肩膀上的命令行实现 在前人的基础上,自定义交互脚本是一个很简单的事情。 这里介绍四个工...

  • 基础语法

    交互式编程 交互式编程,命令行编程 通过 lua或lua -i启动交互式编程 print() 打印 脚本试编程 将...

  • Django中ContentType学习

    模型 进入交互式命令行 查看ContentType调用结果

  • Spring shell 简易使用指南

    前言 Java的很多开源项目中使用到了交互式命令行方式操作。交互式命令行有很多种实现方式。其中Spring she...

  • 2018-01-08

    django shell django的交互式命令行程序。命令行中:python manage.py shell,...

  • Python 3 入门,最全面的基础看这篇就够了!

    基础语法 运行 Python 交互式解释器 在命令行窗口执行python后,进入 Python 的交互式解释器。 ...

  • python开发Sublime Text实用插件

    SublimeCodeIntel代码智能提示和自动完成 SublimeREPL交互式命令行 pylinter实现查...

  • lua的执行

    1.交互式 lua -i 可在命令行中进行交互式编程(执行手敲lua代码) 2.脚本式 lua xx.lua 通...

  • sys.setdefaultencoding('uft8

    我们在交互式命令行中看看解码,编码和字符集的关系

  • [python基础]-03 Python交互两种形式

    1.Python交互模式 存在命令行和交互式两种模式 2.命令行模式 如何进入命令行模式?1.windows通过w...

网友评论

      本文标题:初探交互式命令行

      本文链接:https://www.haomeiwen.com/subject/nvovzktx.html