如何用命令行选择命令,并且执行?

首先说下我的项目,是以vue-li3.0为脚手架。在运行服务和打包改成了指定目录,也就是说这个项目下会有很多的子项目,每次运行或打包需要指定子项目的名称,这是背景。所以想法来了:

1.通过命令行列出所有的子项目名称
2.选择一个名称
3.选择环境(本地环境,测试环境,演示环境...)
4.选择运行服务或打包操作

前面的命令行选择都可以通过inquirer实现,但在选择命令后如何执行命令?
目前我想选择对应的package.json下配置的命令, 如 npm run serve
通过child_process能过执行成功,但是看不到运行的输出结果了

注: 目前我切换子项目并运行的命令是 npm config set project:name demoName && npm run serve, 每次这么写有点累,看看大神们有没有好的实现方法

阅读 3.8k
2 个回答

看不到输出结果是因为你没有将子进程的输出重定向到当前进程,

这样写就好了:

var ls = spawn(_cmd, _args);

    ls.stdout.on('data', data => {
      console.log(`${data}`);
    });

    ls.stderr.on('data', data => {
      console.log(`stderr: ${data}`);
    });

    ls.on('close', code => {
      // console.log(`子进程退出码:${code}`);
    });

首先很感谢@说好的一血呢 提供的方案,我是node渣,最终得以实现

clipboard.png

以下是我实现的代码

const inquirer = require('inquirer');
const fs = require('fs');
const { spawn } = require('child_process');

try {
    // 列出项目名称
    fs.readdir('./project', (err, files) => {
        inquirer.prompt([
            {
                type: 'list',
                name: 'project',
                message: '请选择一个项目',
                choices: files
            },
            {
                type: 'list',
                name: 'dev',
                message: '请选择运行环境',
                choices: ['dev','test']
            },
            {
                type: 'list',
                name: 'operate',
                message: '运行服务还是打包操作?',
                choices: ['serve','build']
            }
        ]).then(v => {
            console.log(v)
            const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'
            const args = ['config', 'set', 'test:name', v.project, '&&', 'npm', 'run', v.operate]
            const opts = {
                stdio: 'inherit' // 并入父进程
            }
            const ls = spawn(cmd, args, opts);
        })
    })
} catch (error) {
    console.error(error)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题