2017-02-28 102 views
0

我需要一种永久设置环境变量的方法。我现在只能在Windows上工作,但是理想情况下我想要一个与操作系统无关的解决方案。从我可以告诉,但Node将只为当前进程/子进程设置var。我甚至想要什么?是否可以永久设置环境变量?

+0

“永久地”影响其他炮弹并继续重新启动?这是非常特定的平台,甚至取决于该人使用的shell。我不知道有一个库这样做,也不是一个好主意,因为如果你开始干扰环境变量到他们的shell配置中,人们有权为难。 – tadman

回答

0

大概可以使用setxexport,虽然不确定需要的含义/特权(我假设在Windows中需要一个UAC凹凸,而在linux中你需要sudo)。这里有一个猜测:

var exec = require('child_process').exec; 

// Add FOO to global environment with value BAR 
// setEnv('FOO', 'BAR', callback) 
// Append /foo/bar to PATH 
// setEnv('PATH', '+=;/foo/bar', callback) 
function setEnv(name, value, cb) { 
    if (!name) throw new Error('name required.'); 
    if (typeof value === 'undefined') throw new Error('value required.'); 

    var cmd; 
    if (value.indexOf('+=') === 0) value = process.env[name] + value.substring(2); 
    value = value.indexOf(' ') > -1 ? `"${value}"` : value; 

    switch (process.platform) { 
    case 'linux': cmd = `export ${name}=${value}`; break; 
    case 'win32': cmd = `setx ${name} ${value} /m"; break; 
    default: throw new Error('unsupported platform.'); break; 
    } 

    exec(cmd, cb); 
} 

我应该提到这真的不是理想;我建议将它们定义为执行任务的一部分,或者使用类似dotenv的东西。

+0

为什么这不理想? – user3715648

+0

我无法想到为什么我会在节点脚本的上下文中修改系统级环境值。我的意思是*可能*在一个实例中,比如从一个生成器中安装某些东西,但我仍然不希望修改我的环境包。 –