簡體   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