繁体   English   中英

Node.JS-从package.json跨脚本导出环境变量失败

[英]Node.JS - Failing in export env variables across scripts from package.json

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

这是./scripts/development.sh

#!/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脚本

{
  // ...
  "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的控制台输出npm run develop

┌─ [ 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

有人知道这是最好的做法,还是有其他方法可以使这项工作成功?

观察员:我已经尝试过直接在npm脚本上设置env var,但是仍然失败。

例如:

{
  // ...
  "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"
  }
  // ...
}

如果您不希望仅通过上述参数,则可以始终执行以下操作。

package.json

"scripts": {
    "start": ". development.sh | node path/to/app/www"
}

在项目根目录中运行“ npm start”(还假设您的项目根目录中包含development.sh)。 这将执行development.sh bash脚本,然后执行您的节点脚本。

两个注意事项:

  1. 我记得阅读上面的语法可能会稍微取决于您的OS /节点版本。 因此,如果遇到任何问题,都应考虑到这一点。

  2. 同样,在您的节点脚本中,环境变量将是过程对象上的键/值。 这将有助于调试目的。

有人知道这是最好的做法,还是有其他方法可以使这项工作成功?

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

假设您不在乎该约束,那么进行此工作的方法是在实际的run命令中执行您的环境:

{
  "scripts": {
    "develop": "NODE_ENV=development NODE_DEBUG=http DEBUG=project:server node ./bin/www"
  }
} 

暂无
暂无

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

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