【问题标题】:Node.JS - Failing in export env variables across scripts from package.jsonNode.JS - 从 package.json 跨脚本导出环境变量失败
【发布时间】:2016-12-08 10:54:01
【问题描述】:

我正在创建一个基于 Express 的 Node.JS 项目,并且我正在尝试设置环境变量以将开发流程与生产流程分开。当我在命令行上运行npm run develop 时,我创建了一个带有一些环境变量(如NODE_ENVDEBUG)的shell 脚本文件,这些变量将由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 的控制台输出:

┌─ [ 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 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"
  }
  // ...
}

【问题讨论】:

  • 有什么原因你没有通过命令行将变量传递给节点。例如,“predevelop”:“node myScript.js pre”和“develop”:“node myScript.js dev”。然后让你的脚本处理传递给 process.argv 数组的命令行参数?
  • 因为它是环境变量,而不是执行参数。例如,Express 使用 NODE_ENV 来控制缓存和日志。 DEBUG 也一样,只针对morgam log npm 包。

标签: javascript node.js express environment-variables


【解决方案1】:

如果你不想只传递上面提到的参数,你总是可以做这样的事情。

package.json

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

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

两个注意事项:

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

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

【讨论】:

    【解决方案2】:

    有人知道这是否是最佳做法,还是有其他方法可以使这项工作发挥作用?

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2016-03-01
      • 2016-03-29
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2018-12-03
      • 2015-07-24
      相关资源
      最近更新 更多