我需要在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为空。
我怎样才能做到这一点?
答案 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"