NPM子模块内的bash脚本如何访问自身的npm环境变量
NPM子模块被父项目调用时访问自身环境变量的解决方案
问题根因
npm的运行时环境变量是基于执行命令时的工作目录下的package.json注入的,当你从父项目调用子模块的bin脚本时,默认工作目录为父项目根目录,npm只会加载父项目的环境变量,不会自动识别子模块的配置。
方案1:指定npm工作目录,直接获取子模块原生环境变量
修改子模块的bash-script.sh,通过--prefix参数指定npm的工作目录为子模块自身的根目录,就能正常注入子模块的npm环境变量:
#!/bin/bash # 获取当前脚本所在的子模块根目录 SUBMODULE_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 指定工作目录执行子模块的npm脚本 npm run get-package-name --prefix "$SUBMODULE_DIR"
执行后会正常返回npm-submodule,所有npm原生支持的环境变量(如版本、依赖配置等)都可以用这种方式获取。
方案2:直接读取子模块的package.json配置
如果不想依赖npm执行,可以直接读取子模块自身的package.json文件提取配置,分两种实现:
依赖jq工具(推荐,JSON解析更稳定)
#!/bin/bash SUBMODULE_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 提取name字段,替换为你需要的字段名即可 SUBMODULE_NAME=$(jq -r '.name' "$SUBMODULE_DIR/package.json") echo $SUBMODULE_NAME
用基础bash命令实现(无额外依赖)
#!/bin/bash SUBMODULE_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 正则提取name字段,适配常规的package.json排版 SUBMODULE_NAME=$(grep '"name"' "$SUBMODULE_DIR/package.json" | awk -F '"' '{print $4}') echo $SUBMODULE_NAME
内容的提问来源于stack exchange,提问作者jv-k
相关产品推荐
相关产品推荐

