在package.json中设置env变量

时间:2018-02-12 03:26:49

标签: node.js bash npm package.json

我需要在preinstall期间设置一个环境变量(.npmrc需要我的npm标记来获取私有包)。这个特定的env var存储在我正在使用的配置服务(Firebase)中,因此需要从服务中获取它然后添加到env中。

我尝试过各种方式,例如在节点脚本中获取它并尝试通过stdout捕获它:

const { spawnSync } = require( 'child_process' );
const ls = spawnSync( 'firebase', [ 'functions:config:get', 'npm.read_only' ] );

JSON.parse(ls.stdout.toString());
// Printing this shows the correct token

我最近的尝试是:

#!/bin/sh

echo 'Setting up development env';

NPM_READ_ONLY_TOKEN=`firebase functions:config:get npm.read_only`

export NPM_READ_ONLY_TOKEN=$(eval echo $NPM_READ_ONLY_TOKEN)

echo 'NPM_READ_ONLY_TOKEN => '$NPM_READ_ONLY_TOKEN;
# Prints the correct token on the screen

exit 0;

但是,当运行"./configEnv.sh && echo $NPM_READ_ONLY_TOKEN"时,env var为空。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题,您希望通过执行configEnv.sh来获取您的令牌,然后在该流中使用该令牌。

您现在遇到的问题与环境变量的范围有关,这些变量仅限于当前流程(及其子项,如果变量为export ed)。环境变量永远不会传播回父shell。

执行list ./configEnv.sh && echo $TOKEN时,configEnv.sh在其自己的(单独的)子shell中执行,因此列表中的下一个进程(echo ..)不会收到你设置的令牌。

解决此问题的一种方法是在同一个shell 中执行令牌提取(和设置)例程,只需获取configEnv.sh

#!/bin/sh
# Usage: . configEnv.sh
echo 'Setting up development env';
export NPM_READ_ONLY_TOKEN=$(firebase functions:config:get npm.read_only)

然后在同一个shell(或其子代)中使用该标记:

. configEnv.sh && echo "$NPM_READ_ONLY_TOKEN"