gpt4 book ai didi

node.js - 如何通过child_process.spawn()执行本地安装的Node.js应用程序?

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:38 25 4
gpt4 key购买 nike

我想通过 child_process.spawn 执行 Electron 应用程序:

import ChildProcess, {ChildProcess as ChildProcess__type} from 'child_process';
const childProcess: ChildProcess__type = ChildProcess.spawn(
'electron',
['ProjectInitializer__ElectronMain.js'],
{ cwd: __dirname } // current project root
);

我收到错误:生成 Electron ENOENT 错误。 Electron 已在本地安装,AFAIK 是很好的做法。另外, Electron ProjectInitializer__ElectronMain.js 也可以工作,它可以从我的项目目录执行此控制台命令。

关注经常被点赞的ENOENT error debugging guidance ,我得到原因:process.env.PATH中没有包含electron的目录。

我对PATH变量了解不多,所以我无法回答这个变量中必须包含什么以及不包含什么。但我想问的是:如何执行本地安装(在 node_modules 中)的 Node.js 应用程序(如 electron)?

顺便说一下,execa这被称为改进的 child_process 运行 Electron 没有错误(更新:版本 2.x.x 已经不运行):

import executeExternalCommand, { ExecaReturnValue } from 'execa';

try {
await executeExternalCommand(
'electron',
['ProjectInitializer__ElectronMain.js'],
{ cwd: __dirname }
);
} catch (error) {
console.error(error);
}

不知何故,多亏了{ cwd: __dirname }execa v 1.x.x知道应该在哪里找到 Electron 。不幸的是,execa 的社区太小,文档也太少,所以停止使用它。

其他信息

如何运行这个具有生成参数的 Node.js 脚本

通过我创建的命令my-library init

在 package.json 中:

"bin": {
"my-library": "bin/my-library"
}

bin/my-library 中(无文件扩展名):

#!/usr/bin/env node

require('../CLI').interpretConsoleCommandAndExecute(process.argv);

CLI.js中,我解析控制台命令,如果它是my-library init,我将尝试执行

const childProcess: ChildProcess__type = ChildProcess.spawn(
'electron',
[ 'ProjectInitializer__ElectronMain.js' ],
{ cwd: __dirname }
);

console.log(process.env) 输出

以下输出适用于 PhpStorm 内置控制台,但在其他控制台中,例如G。在cmder中,输出是不同的。

{ FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer',
CommonProgramFiles: 'C:\\Program Files\\Common Files',
PROMPT: '$P$G',
SESSIONNAME: 'Console',
COMPUTERNAME: 'MSI',
OneDriveConsumer: 'D:\\OneDrive',
__INTELLIJ_COMMAND_HISTFILE__:
'C:\\Users\\i\\.PhpStorm2019.1\\config\\terminal\\history\\history-34',
SystemDrive: 'C:',
NUMBER_OF_PROCESSORS: '12',
LOGONSERVER: '\\\\MSI',
TEMP: 'C:\\Users\\i\\AppData\\Local\\Temp',
TMP: 'C:\\Users\\i\\AppData\\Local\\Temp',
HOMEPATH: '\\Users\\i',
PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC',
USERNAME: 'i',
ProgramFiles: 'C:\\Program Files',
USERDOMAIN_ROAMINGPROFILE: 'MSI',
LOCALAPPDATA: 'C:\\Users\\i\\AppData\\Local',
TERMINAL_EMULATOR: 'JetBrains-JediTerm',
PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel',
DriverData: 'C:\\Windows\\System32\\Drivers\\DriverData',
APPDATA: 'C:\\Users\\i\\AppData\\Roaming',
ALLUSERSPROFILE: 'C:\\ProgramData',
USERDOMAIN: 'MSI',
OS: 'Windows_NT',
PROCESSOR_LEVEL: '6',
ProgramData: 'C:\\ProgramData',
ComSpec: 'C:\\Windows\\system32\\cmd.exe',
PROCESSOR_ARCHITECTURE: 'AMD64',
FPS_BROWSER_USER_PROFILE_STRING: 'Default',
SystemRoot: 'C:\\Windows',
PROCESSOR_REVISION: '9e0a',
OneDrive: 'D:\\OneDrive',
PSModulePath:
'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules',
PATH:
'D:\\PhpStorm\\InHouseDevelopment\\my-library\\node_modules\\.bin;C:\\ProgramData\\DockerDesktop\\version-bin;C:\\Program Files\\Docker\\Docker\\Resources\\bin;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\iCLS\\;C:\\Program Files
\\Intel\\Intel(R) Management Engine Components\\iCLS\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Pro
gram Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common Files\\Intel\\WirelessCommon\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\I
ntel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\Common Files\\Acronis\\VirtualFile\\;C:\\Program Files (x86)\\Common Files\\Acronis\\VirtualFile64\\;C:\\Program Files (x86)\\Com
mon Files\\Acronis\\FileProtector\\;C:\\Program Files (x86)\\Common Files\\Acronis\\FileProtector64\\;C:\\Program Files (x86)\\Common Files\\Acronis\\SnapAPI\\;C:\\Program Files\\nodejs\\;C:\\Program Files\\Git\\cmd;C:\\Program Files (x86)\\Yarn\\bin\\;C:\\Users\\t
okug\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\i\\AppData\\Roaming\\npm;C:\\Users\\i\\AppData\\Local\\Yarn\\bin;C:\\texlive\\2019\\bin\\win32',
'ProgramFiles(x86)': 'C:\\Program Files (x86)',
USERPROFILE: 'C:\\Users\\i',
windir: 'C:\\Windows',
ProgramW6432: 'C:\\Program Files',
configsetroot: 'C:\\Windows\\ConfigSetRoot',
'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files',
PUBLIC: 'C:\\Users\\Public',
HOMEDRIVE: 'C:',
CommonProgramW6432: 'C:\\Program Files\\Common Files' }

尝试执行 ChildProcess.spawn('env')

在 Php Storm 控制台中,它会导致熟悉的错误:spawn env ENOENT

最佳答案

正如聊天中所讨论的,您收到的错误通常是由于您尝试运行的可执行文件不可用而引起的

现在可执行文件不可用的原因有多种

  1. 系统上根本不存在可执行文件
  2. 可执行文件存在,但不在系统 PATH 变量定义的文件夹中
  3. 可执行文件位于当前目录中,但运行进程的目录上下文不同

要修复#1#2,您只需在系统路径中全局安装可执行文件

要修复#3,您可以做两件事。添加当前目录的路径 ({ cwd: __dirname}) 以及可执行文件的相对路径

const childProcess: ChildProcess__type = ChildProcess.spawn( 
Path.resolve(__dirname, 'node_modules/.bin/electron'),
[ Path.resolve(__dirname, 'ProjectInitializer__ElectronMain.js') ],
{ cwd: __dirname}
);

const childProcess: ChildProcess__type = ChildProcess.spawn( 
'./node_modules/.bin/electron'),
[ Path.resolve(__dirname, 'ProjectInitializer__ElectronMain.js') ],
{ cwd: __dirname}
);

const childProcess: ChildProcess__type = ChildProcess.spawn( 
'node_modules/.bin/electron',
[ './ProjectInitializer__ElectronMain.js' ],
{ cwd: __dirname}
);

如果您决定覆盖 PATH 环境变量,您可以传递具有更多值的 env 参数

const childProcess: ChildProcess__type = ChildProcess.spawn( 
'node_modules/.bin/electron',
[ './ProjectInitializer__ElectronMain.js' ],
{ cwd: __dirname, env: {....}}
);

您可以使用 process.env 中的现有环境变量,然后更新相同的环境变量,并将其传递给 env 参数

关于node.js - 如何通过child_process.spawn()执行本地安装的Node.js应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56732419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com