spawn.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const logger = require('./logger')
  2. const log = logger('app:spawn')
  3. const warn = logger('app:spawn', 'red')
  4. const crossSpawn = require('cross-spawn')
  5. /*
  6. Returns pid, takes onClose
  7. */
  8. module.exports.spawn = function (cmd, params, cwd, onClose) {
  9. log(`Running "${cmd} ${params.join(' ')}"`)
  10. log()
  11. const runner = crossSpawn(
  12. cmd,
  13. params, {
  14. stdio: 'inherit',
  15. stdout: 'inherit',
  16. stderr: 'inherit',
  17. cwd
  18. }
  19. )
  20. runner.on('close', code => {
  21. log()
  22. if (code) {
  23. log(`Command "${cmd}" failed with exit code: ${code}`)
  24. }
  25. onClose && onClose(code)
  26. })
  27. return runner.pid
  28. }
  29. /*
  30. Returns nothing, takes onFail
  31. */
  32. module.exports.spawnSync = function (cmd, params, cwd, onFail) {
  33. log(`[sync] Running "${cmd} ${params.join(' ')}"`)
  34. log()
  35. const runner = crossSpawn.sync(
  36. cmd,
  37. params, {
  38. stdio: 'inherit',
  39. stdout: 'inherit',
  40. stderr: 'inherit',
  41. cwd
  42. }
  43. )
  44. if (runner.status || runner.error) {
  45. warn()
  46. warn(`⚠️ Command "${cmd}" failed with exit code: ${runner.status}`)
  47. if (runner.status === null) {
  48. warn(`⚠️ Please globally install "${cmd}"`)
  49. }
  50. onFail && onFail()
  51. process.exit(1)
  52. }
  53. }