【发布时间】:2014-05-05 21:46:43
【问题描述】:
我正在开发一个安装程序,它可以自动安装 Node.js,将节点应用程序提取到文件夹中,然后通过 npm install 安装它。但是,安装程序总是需要运行两次才能使npm 工作。这是安装到 Windows 上。
在我的安装程序应用程序的生命周期内...
- 如果尚未安装 Node.js,则会安装它
- 在同一过程中,稍后执行
npm install - 如果在安装程序启动之前 Node.js 不存在,它会失败并指出
npm不是有效命令 - 如果安装程序启动时已经安装了 Node.js,则安装成功
我假设Node.js 的安装会创建新的环境变量,但我的进程尚未获得这些新变量——直到进程重新启动。然后,第二次它可以看到这些变量。否则,在同一进程中,它无法找到npm,因为它无法看到新的环境变量。至少这是我缩小问题范围的唯一原因,也是为什么我总是必须运行我的安装程序两次的唯一解释。
背景:安装程序是使用 Inno Setup (Unicode) 创建的。我在 Delphi 中创建了一个应用程序,以便在安装完成时向用户显示一个界面,因为大多数原始安装程序只是显示一个空白的无响应页面,上面写着“正在准备安装...”。这个 Delphi 应用程序在一个线程内执行实际的安装过程,该线程使用事件来更新用户可见的网格。此事件驱动线程将每个安装步骤的进度报告回主窗体,并显示一个响应式用户界面,显示安装过程的每个步骤及其状态。然后,此应用程序将退出代码返回给安装程序以供进一步处理。
如果不是要求每个子进程等待并获取它们的退出代码,这将不是问题。但既然我需要这样做,Windows自然会将缓存的环境变量传递给每个子进程,仍然使它们无用。
如何强制我的应用程序查看自进程启动以来添加的新环境变量?
【问题讨论】:
-
@SomeKittensUx2666 建议的重复与使用命令提示符有关,答案无用。
-
您如何从安装程序安装 node.js?您是链接 node.js MSI,还是自己直接分发 .exe?
-
@Chris 我正在链接 MSI,并且此应用程序中的每一步都返回一个退出代码以监控成功。我在 Delphi 应用程序的一个线程中执行此操作,该应用程序以表格形式向用户显示网格,以查看每个步骤的进度,更新状态。然后从 Inno Setup 安装程序调用 Delphi 应用程序,该安装程序传递退出代码,并且每个外部调用在继续之前等待结果。
-
编辑了我的问题来解释。不幸的是,似乎唯一的解决方案是要求我的应用程序运行两次,需要重新启动,或者经历大量的混乱,创建多个 EXE 来处理不同的安装步骤。
标签: node.js environment-variables npm shellexecute