如何在npm脚本中替换版本号的.为-,且实现Windows系统兼容
问题原因
你遇到的报错是因为npm执行脚本时默认的shell环境不支持bash专属的变量替换语法:
- 类Unix系统下npm默认调用
sh而非bash,${var//pattern/replacement}是bash扩展语法,sh不支持 - Windows系统下npm默认调用
cmd或powershell,完全不兼容该类bash语法
跨Windows兼容方案
方案1:零依赖Node内联脚本(优先推荐)
所有npm用户都已安装Node.js,直接通过Node处理版本号替换再执行部署命令,完全跨平台,无需额外安装依赖:
{ "scripts": { "gcp:deploy": "node -e \"const v = process.env.npm_package_version.replace(/\\./g, '-'); require('child_process').execSync(`gcloud app deploy --no-promote --version=${v}`, { stdio: 'inherit' })\"" } }
该写法通过Node内置API处理字符串替换和命令执行,兼容所有Node支持的操作系统,执行时会直接透传gcloud的输出日志到终端。
方案2:使用跨平台变量处理工具cross-var
如果偏好更简洁的写法,可以安装专门的跨平台环境变量处理工具:
- 安装开发依赖:
npm install -D cross-var
- 修改npm脚本:
{ "scripts": { "gcp:deploy": "cross-var gcloud app deploy --no-promote --version=${npm_package_version//./-}" } }
仅类Unix系统兼容方案
如果不需要支持Windows,可以直接指定用bash执行脚本即可避免sh语法不兼容问题:
{ "scripts": { "gcp:deploy": "bash -c 'gcloud app deploy --no-promote --version=${npm_package_version//./-}'" } }
内容的提问来源于stack exchange,提问作者Giovanni Cardamone
相关产品推荐
相关产品推荐

