在Node.js之外设置全局环境变量

14

我正在尝试在我的node.js应用程序中设置全局环境变量。

目标是:

  1. 重启APP时,环境变量仍应设置
  2. 打开新终端时,应该可用
  3. 如果可能:重启时,与1相同。
  4. 它应该在Linux、Mac OS X上工作(并且需要Windows的备用SET命令)

这是我做的:

var setEnv = require('child_process')
        .spawn('export GLOBALVARNAME='+my.value,{
          stdio: 'inherit',
          env: process.env
        });

但这会导致...

{ [Error: spawn export GLOBALVARNAME=foobar ENOENT]
  code: 'ENOENT',
  errno: 'ENOENT',
  syscall: 'spawn export GLOBALVARNAME=foobar',
  path: 'export GLOBALVARNAME=foobar',
  spawnargs: [] }

我没有在Windows上测试过这个,但在Mac OS X(和Linux)上,在bash中正确的命令是export GLOBALVARNAME=value。对于Windows,正确的命令应该是SET GLOBALVARNAME=value - 是吗?

所以主要问题是:手动工作时export GLOBALVARNAME=foobar出了什么问题?


要了解为什么会出现 ENOENT 错误,请查看 https://dev59.com/1GIj5IYBdhLWcg3wxnyd。 - chicks
3个回答

4
作为其他答案已经指出的,外壳和更改环境变量基本上是一个NO-OP。无论是要更改当前进程及其子进程的环境还是要更改新进程的环境。像@Hmlth所说,编辑/etc/profile将使任何新进程的更改生效。
如果要更改当前进程的环境,则很简单:
process.env.YOUR_VAR = 'your_value';

3

export不是独立的命令,而是一个shell内置命令,它设置了当前shell进程及其后续派生子进程的环境变量。

你不能为非当前进程的祖先进程设置环境变量。在Linux中,也没有所谓的系统环境变量。

在Linux下,你应该在启动你的应用程序的init脚本或systemd单元中设置变量。如果你想在交互式用户shell中使用它,应该在 /etc/profile/etc/profile.d 中设置。

.


我原以为这是一个独立的命令...太糟糕了。所以我需要打开一个文件并写入它。该死... - user3984802
https://dev59.com/5W445IYBdhLWcg3wappH 展示了如何在不通过shell的情况下访问您的环境变量。它同样适用于写操作。 - chicks

2

试试这个:

https://www.npmjs.com/package/shelljs

我认为子进程不可能更改父进程的进程环境。所以我真的认为不能使用 child_process

示例代码:

var shell = require('shelljs');
shell.exec('export ENV_VARIABLE=ABRACADABRA');

你是对的,使用child_process不起作用。虽然导出使事物全局化,但父shell是什么并不重要... - user3984802
它在Windows中也不会工作。ShellJS的主要目标是跨平台。 - sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接