2017-03-15 185 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