首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.JS -跨package.json脚本导出env变量失败

Node.JS -跨package.json脚本导出env变量失败
EN

Stack Overflow用户
提问于 2016-08-02 22:19:23
回答 2查看 1.4K关注 0票数 1

我正在创建一个基于Express的Node.JS项目,并试图设置环境变量以将开发与生产流量分离开来。我创建了一个shell脚本文件,其中包含一些env变量,比如NODE_ENVDEBUG,以便在命令行上运行npm run develop时由predevelop脚本执行,但是在predevelop完成执行并在运行Express应用程序时获得undefined之后,变量就会丢失。

这是./scripts/development.sh

代码语言:javascript
复制
#!/bin/sh

echo 'Setting up development env';

export NODE_ENV='development';
export NODE_DEBUG='http';
export DEBUG='project:server';

echo 'NODE_ENV => '$NODE_ENV;
echo 'NODE_DEBUG => '$NODE_DEBUG;
echo 'DEBUG => '$DEBUG;

exit 0;

这是我的package.json脚本

代码语言:javascript
复制
{
  // ...
  "scripts": {
    "predevelop": "/bin/bash ./scripts/development.sh",
    "develop": "echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www"
  }
  // ...
}

来自npm run develop的控制台输出

代码语言:javascript
复制
┌─ [ jcorradi ] ~/Sites/pocs/project-server  
└─• npm run develop

> project-server@0.0.0 predevelop /home/jcorradi/Sites/pocs/project-server
> /bin/bash ./scripts/development.sh

Setting up development env
NODE_ENV => development
NODE_DEBUG => http
DEBUG => project:server

> project-server@0.0.0 develop /home/jcorradi/Sites/pocs/project-server
> echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www

NODE_ENV =>
NODE_DEBUG =>
DEBUG =>

// From ./bin/www
NODE_ENV => undefined
NODE_DEBUG => undefined
DEBUG => undefined

有人知道这是最好的做法,还是有其他办法使这一工作?

Obs:我已经尝试过在npm脚本上直接设置env,但这仍然失败。

例如:

代码语言:javascript
复制
{
  // ...
  "scripts": {
    "predevelop": "NODE_ENV='development'; NODE_DEBUG='http'; DEBUG='project:server';",
    "develop": "echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www"
  }
  // ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-03 19:34:10

如果你不想像上面提到的那样只传递这些平行线,你可以做这样的事情。

package.json

代码语言:javascript
复制
"scripts": {
    "start": ". development.sh | node path/to/app/www"
}

在项目根运行"npm“(也假设development.sh在您的项目根中)。这将执行development.sh bash脚本,然后执行节点脚本。

两份说明:

  1. 我记得上面的语法可能稍微依赖于节点的OS/版本。所以,如果你遇到任何问题,要考虑到这一点。
  2. 此外,在节点脚本中,环境变量将是流程对象的键/值。这将有助于了解调试目的。
票数 1
EN

Stack Overflow用户

发布于 2016-08-03 19:52:21

有人知道这是最好的做法,还是有其他办法使这一工作?

最佳实践是避免在package.json中设置环境变量,这应该与环境无关,以便支持没有bash或在/usr/bin/bash中安装bash的环境。

假设您不关心这个约束,那么执行此工作的方法是在实际运行命令中执行您的环境:

代码语言:javascript
复制
{
  "scripts": {
    "develop": "NODE_ENV=development NODE_DEBUG=http DEBUG=project:server node ./bin/www"
  }
} 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38731379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档