Из-за недавних требований к проекту необходимо запускать службу nginx при запуске клиента Electron, поэтому я изучил, как вызывать командную строку в Electron. Поскольку Electron основан на Chromium и Node.js, он может напрямую использовать Node.js API и некоторые пакеты. В настоящее время существует два метода исследования:
child_process
child_process— это встроенный модуль Node.js, который позволяет создавать дочерние процессы.
Код реализации:
const exec = require('child_process').exec
export function start () {
// 任何你期望执行的cmd命令,ls都可以
let cmdStr1 = 'your command code'
let cmdPath = './file/'
// 子进程名称
let workerProcess
runExec(cmdStr1)
function runExec (cmdStr) {
workerProcess = exec(cmdStr, { cwd: cmdPath })
// 打印正常的后台可执行程序输出
workerProcess.stdout.on('data', function (data) {
console.log('stdout: ' + data)
})
// 打印错误的后台可执行程序输出
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data)
})
// 退出之后的输出
workerProcess.on('close', function (code) {
console.log('out code:' + code)
})
}
}
node-cmd
node-cmd— это пакет, который позволяет Node.js вызывать командную строку.
Сначала нам нужно установить:
npm install node-cmd --save
Код реализации:
var cmd=require('node-cmd');
cmd.get(
'pwd',
function(err, data, stderr){
console.log('the current working dir is : ',data)
}
);
cmd.run('touch example.created.file');
cmd.get(
'ls',
function(err, data, stderr){
console.log('the current dir contains these files :\n\n',data)
}
);
cmd.get(
`
git clone https://github.com/RIAEvangelist/node-cmd.git
cd node-cmd
ls
`,
function(err, data, stderr){
if (!err) {
console.log('the node-cmd cloned dir contains these files :\n\n',data)
} else {
console.log('error', err)
}
}
);
Выше приведены два способа вызова командной строки в Electron, по сути, все они используют возможности Node.js.
Разница между ними в том, что child_process может указать путь для выполнения команды, корневой каталог проекта по умолчанию, в то время как node-cmd не может указать путь выполнения, а может только перейти к целевому пути сам по себе.
Я использую child_process, и конкретный сценарий использования также должен основываться на моих собственных потребностях.