Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
npm在安装Node.js后立即失败_Node.js_Environment Variables_Npm_Shellexecute - Fatal编程技术网

npm在安装Node.js后立即失败

npm在安装Node.js后立即失败,node.js,environment-variables,npm,shellexecute,Node.js,Environment Variables,Npm,Shellexecute,我正在开发一个安装程序,它可以自动安装Node.js,将节点应用程序提取到文件夹中,然后通过npm install进行安装。但是,安装程序始终需要运行两次才能使npm正常工作。这正在安装到Windows上 在我的安装程序应用程序的生命周期内 如果尚未安装Node.js,则会安装它 在相同的过程中,执行后面的步骤,npm安装 如果Node.js在安装程序启动之前不存在,则说明npm不是有效命令时失败 如果安装程序启动时已安装Node.js,则安装会成功 我假设Node.js的安装创建了新的环境

我正在开发一个安装程序,它可以自动安装Node.js,将节点应用程序提取到文件夹中,然后通过
npm install
进行安装。但是,安装程序始终需要运行两次才能使
npm
正常工作。这正在安装到Windows上

在我的安装程序应用程序的生命周期内

  • 如果尚未安装Node.js,则会安装它
  • 在相同的过程中,执行后面的步骤,
    npm安装
  • 如果Node.js在安装程序启动之前不存在,则说明
    npm
    不是有效命令时失败
  • 如果安装程序启动时已安装Node.js,则安装会成功
我假设
Node.js
的安装创建了新的环境变量,但我的流程尚未获得这些新变量,直到流程重新启动。然后,第二次它可以看到这些变量。否则,在同一进程中,它无法找到
npm
,因为它无法看到新的环境变量。至少这是我将问题缩小到的范围,也是我总是要运行安装程序两次的唯一解释

背景:安装程序是使用Inno设置(Unicode)创建的。我在Delphi中创建了一个应用程序,在安装过程中向用户显示一个界面,因为大多数原始安装程序只是显示一个空白的非响应页面,上面写着“准备安装…”。此Delphi应用程序在线程内执行实际安装过程,该线程使用事件更新用户可见的网格。此事件驱动线程将每个安装步骤的进度报告回主窗体,并显示一个响应用户界面,显示安装过程的每个步骤及其状态。然后,该应用程序将退出代码返回给安装程序,以便进一步处理

如果不是因为需要等待每个子进程并获取它们的退出代码,这不会是一个问题。但由于我需要这样做,Windows自然会将缓存的环境变量传递给每个子进程,仍然使它们变得无用


如何强制应用程序查看自进程启动以来添加的新环境变量?

无需重新启动应用程序的解决方案是将完整路径传递到
nodejs
程序文件文件夹中的
npm
命令。这样,您就不需要依赖Windows及其环境变量——这是一条直接的路线。请注意您安装的是Node.js的32位版本还是64位版本,并确保查看相应的文件夹

C:\Program Files\nodejs\npm
C:\Program Files (x86)\nodejs\npm

@SomeKittensUx2666的可能重复项建议的重复项与使用命令提示符有关,答案是无用的。您如何从安装程序安装node.js?你是在链接node.js MSI,还是自己直接分发.exe?@Chris我在链接MSI,这个应用程序中的每一步都会返回一个退出代码来监控成功。我在Delphi应用程序中的一个线程中执行此操作,该应用程序以表格形式向用户显示网格,以查看每个步骤的进度,更新状态。然后从Inno安装程序调用Delphi应用程序,该安装程序传递退出代码,每次外部调用都会等待结果,然后再继续。不幸的是,唯一的解决方案似乎是要么要求我的应用程序运行两次,要么重新启动,要么经历一大堆混乱,创建多个EXE来处理不同的安装步骤。请注意,使用
PATH
环境变量,您总是可以从32位安装程序获得32位路径。