2017-09-21 72 views
0

我目前正在嘗試製作一個簡單的命令行節點程序,它允許我輕鬆地爲我製作的許多React/Redux應用程序創建樣板。我使用ShellJS來執行控制檯命令(我也試過使用Node's child_process)。問題是cli-spinner與執行終端命令一起工作。這是我的代碼:如何在ShellJS命令exec期間運行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之間的衝突造成的。

回答

0

我能夠通過使用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');