1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- const path = require('path');
- const utils = require('./utils');
- const merge = utils.merge;
- const bus = utils.bus;
- const spawn = require('child_process').spawn;
- module.exports = function spawnCommand(command, config, eventArgs) {
- var stdio = ['pipe', 'pipe', 'pipe'];
- if (config.options.stdout) {
- stdio = ['pipe', process.stdout, process.stderr];
- }
- const env = merge(process.env, { FILENAME: eventArgs[0] });
- var sh = 'sh';
- var shFlag = '-c';
- var spawnOptions = {
- env: merge(config.options.execOptions.env, env),
- stdio: stdio,
- };
- if (!Array.isArray(command)) {
- command = [command];
- }
- if (utils.isWindows) {
- // if the exec includes a forward slash, reverse it for windows compat
- // but *only* apply to the first command, and none of the arguments.
- // ref #1251 and #1236
- command = command.map(executable => {
- if (executable.indexOf('/') === -1) {
- return executable;
- }
- return executable.split(' ').map((e, i) => {
- if (i === 0) {
- return path.normalize(e);
- }
- return e;
- }).join(' ');
- });
- // taken from npm's cli: https://git.io/vNFD4
- sh = process.env.comspec || 'cmd';
- shFlag = '/d /s /c';
- spawnOptions.windowsVerbatimArguments = true;
- }
- const args = command.join(' ');
- const child = spawn(sh, [shFlag, args], spawnOptions);
- if (config.required) {
- var emit = {
- stdout: function (data) {
- bus.emit('stdout', data);
- },
- stderr: function (data) {
- bus.emit('stderr', data);
- },
- };
- // now work out what to bind to...
- if (config.options.stdout) {
- child.on('stdout', emit.stdout).on('stderr', emit.stderr);
- } else {
- child.stdout.on('data', emit.stdout);
- child.stderr.on('data', emit.stderr);
- bus.stdout = child.stdout;
- bus.stderr = child.stderr;
- }
- }
- };
|