2017-03-15 226 views
0

我目前正在研究Node.js項目,並希望自動設置環境變量。我寫了一個腳本(set_env.ps1),看起來是這樣的:從.ps1腳本設置環境變量

Write-Host "Setting environment variables..."; 
$env:CLIENT_KEY="xxxxxxxxxxxxxxxx"; 
$env:CLIENT_SECRET="xxxxxxxxxxxxx"; 
[etc] 

而且我把這個一些NPM腳本:

"scripts": { 
    "install:windows": "powershell ./set_env.ps1", 
    "start": "npm run install:windows && node index", 
    "monitor": "npm run install:windows && nodemon index" 
}, 

它似乎沒有工作,雖然。我可以手動輸入這些相同的命令,每次一個,在命令行中輸入,並設置環境變量。但是,通過運行腳本,「設置環境變量...」會打印到PowerShell提示符,但不會設置變量。

互聯網上的所有東西似乎都想從提示符一次執行一個env變量。這對於一長串環境變量來說是非常單調乏味的,Webstorm中嵌入的Powershell提示符有一個不接受粘貼字符串的習慣。

+0

一般而言,每個派生進程都會繼承父環境的副本,該環境在終止產生的進程時會丟失。你必須尋找一種不同的方法來切換變量。 – LotPings

+0

您需要在觸發npm命令的過程中設置變量。 –

+0

@Bill_Stewart hehh,那麼從命令提示符運行npm時,你不能這麼做,因爲我在做...但是,你的評論讓我思考,並且我意識到:我*可以*運行'npm' Powershell腳本中的命令。即將回答。 –

回答

0

回答這個問題是因爲可能有人會遇到這個問題。

正如兩個註釋所示,Powershell腳本進程的環境在終止時丟失。因此,在腳本中設置的環境變量將不會傳遞到Powershell提示符。

相反鏈NPM腳本調用我們需要的一切,而不是我們可以稱之爲npm run monitornpm run start從PowerShell腳本,像這樣:

Write-Host "Setting environment variables..."; 
$env:CLIENT_KEY="xxxxxxxxxxxxxxxxx"; 
$env:CLIENT_SECRET="xxxxxxxxxxxxxxxxxxxxxxx"; 
[etc] 
[...] 
Write-Host "Initializing process..." 

npm run monitor 

然後,我們有我們的NPM腳本,像這樣:

"scripts": { 
    "start:windows": "powershell ./start.ps1", 
    "start": "node index", 
    "monitor": "nodemon index" 
} 

要從命令提示符啓動,請運行npm run start:windows