繁体   English   中英

NPM:如何在 package.json 的预启动脚本中挂钩 SET NODE_ENV?

[英]NPM: How can I hook SET NODE_ENV in package.json's prestart script?

我有一个使用 npm init -y 创建的基本应用程序。 在 package.json 我有一个指向 server.js 的主条目。

{
  "name": "rest-api",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "prestart": "SET NODE_ENV=dev"
}

我试图在 prestart 中设置 NODE_ENV 变量并让 npm 调用 main 来调用 npm start。 但是在 prestart 中设置的环境变量没有被结转并且是未定义的。 当我运行“npm start”时,控制台输出这两个命令都按顺序执行。

    PS D:\test\RestAPI> npm start

    > rest-api@1.0.0 prestart D:\test\RestAPI
    > set NODE_ENV=dev

    > rest-api@1.0.0 start D:\test\RestAPI
    > node server.js

    undefined
    [undefined] Listening on http://localhost:3000

但是当我从应用程序打印变量时,它是未定义的。 我在这里做错了什么,或者这是应该的行为方式吗? 有没有办法使用“SET NODE_ENV=dev”调用和设置环境变量而不将它链接到“node server.js”

当我在“开始”中组合两者时,如下所示,则设置了环境变量。

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
     "start": "set NODE_ENV=dev && node server.js"
  }

我正在 Windows 10,npm 版本 3.10.10 上测试这个。 感谢你的帮助。

我知道如何使用“开始”在 package.json 中完成此操作。 这个问题是关于如何通过“预启动”来实现的。

谢谢。

简短的回答是不可能的。

1. 为什么:这是不可能的,因为每个脚本都由 npm 为此目的产生的不同进程执行,这些进程有自己的环境变量。

要实现这一点,请创建测试项目并将两个脚本配置为

"start":   "pause&&set VAR1",
"prestart" : "pause&&set VAR1=value&&set VAR1&&pause",

在 Windows 上打开任务管理器并密切注意在运行脚本之前列出了多少个 cmd 进程。

运行命令“npm start”并在每次请求时“按任意键继续...”只需注意创建的进程是如何创建的。 我按顺序附上了截图在此处输入图片说明

2. 除非:您更改 npm 执行不同脚本的方式,以对所有我认为很复杂并且可能会产生错误的脚本使用一个 cmd。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM