javascript - 如何在 ShellJS 命令执行期间运行 cli-spinner?

标签 javascript node.js command-line-interface shelljs

我目前正在尝试制作一个简单的命令行 Node 程序,让我可以轻松地为我制作的许多 React/Redux 应用程序创建样板。我正在使用 ShellJS执行控制台命令(我也尝试使用 Node's child_process 。)问题是越来越 cli-spinner与执行终端命令一起工作。这是我的代码:

#! /usr/bin/env node
var shell = require('shelljs');
var userArgs = process.argv.slice(2);
var folderName = userArgs[0];
var Spinner = require('cli-spinner').Spinner;
var depSpin = new Spinner('Installing dependencies.. %s');
depSpin.setSpinnerString(10);

shell.mkdir(folderName);
shell.cd(folderName);

depSpin.start(); 
// I expect for the spinner to start here (before the execution of the commands.)

shell.exec('npm init -y', {silent: true});
shell.exec('npm install --save babel-core babel-loader babel-preset-es2015 babel-preset-react react-dom react-redux redux webpack', {silent: true});
shell.exec('npm install --save-dev babel-preset-env webpack-dev-server', {silent: true});

depSpin.stop(); 
// Since ShellJS should run synchronously, 
// the spinner should stop right after the last command finishes.

shell.touch('webpack.config.js');
shell.mkdir(['build', 'frontend']);

shell.cd('frontend');
shell.mkdir(['components', 'containers', 'reducers', 'store']);
shell.touch('app.js');

但是当运行程序时,它只是在安装依赖项时挂起而没有显示任何内容。这与微调器代码甚至不在其中时的情况相同。我还尝试删除 depSpin.stop(),这只会让程序永远卡在微调器上。我感觉这个问题是由 cli-spinnerShellJS 都使用终端的冲突引起的。

最佳答案

我能够通过使用 child_processspawn 来实现这种效果。我必须创建一个 child_process.spawn 并运行所有与 && 连接的命令。这将控制台输出释放为专门的 cli-spinner 输出。然后,当子进程退出以停止微调器时,我做了一个事件处理程序。

#! /usr/bin/env node
var shell = require('shelljs');
var userArgs = process.argv.slice(2);
var folderName = userArgs[0];
var Spinner = require('cli-spinner').Spinner;
var depSpin = new Spinner('Installing dependencies.. %s');
var spawn = require('child_process').spawn;
var commandsDep = [
  'cd ' + folderName,
  'npm init -y',
  'npm install --save babel-core babel-loader babel-preset-es2015 babel-preset-react react-dom react-redux redux webpack',
  'npm install --save-dev babel-preset-env webpack-dev-server'
];
var depChild = spawn(commandsDep.join(' && '), {
  shell: true
});
depSpin.setSpinnerString(18);

shell.mkdir(folderName);
shell.cd(folderName);

depSpin.start();
depChild.on('exit', () => {
  depSpin.stop();
  shell.exec('clear');
  console.log('Installing dependencies.. ✓');
})

shell.touch('webpack.config.js');
shell.mkdir(['build', 'frontend']);

shell.cd('frontend');
shell.mkdir(['components', 'containers', 'reducers', 'store']);
shell.touch('app.js');

shell.cd('containers');
shell.touch(['AppContainer.js', 'Root.js']);

shell.cd('../reducers');
shell.touch('index.js');

shell.cd('../store');
shell.touch('configureStore.js');

关于javascript - 如何在 ShellJS 命令执行期间运行 cli-spinner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46354368/

相关文章:

php - codeigniter 的自定义 cli

git - Brew 找不到 git,即使路径中有 git (Mac/OSX)

Ubuntu CLI 批量查找 CP

javascript - Puppeteer 未拾取对话框

javascript - 为什么这个 PHP AJAX MysQl 聊天脚本需要页面刷新?

javascript - 如何添加 e.preventDefault()

javascript - Toggle JavaScript 中的可见性

javascript - 如何限制使用 icheck jquery 插件选中的复选框?

javascript - 获取 API 。我从自己的 express 服务器收到一个空字符串

node.js - 如何真正调试node.js应用程序?