合并npm脚本时tsnd参数丢失、环境变量失效如何解决?
问题描述
合并两个npm脚本时出现异常:tsnd的参数无法正常传递,dotenv包不可用,用&符号合并命令会导致cross-env失效,环境变量无法正确定义。
当前package.json中的脚本配置:
"define:local": "cross-env NODE_ENV=local FOO=bar BAZ=foo", "local:dev": "npm run define:local tsnd --inspect --respawn path/to/mycode.ts"
运行npm run local:dev后,终端输出如下:
cross-env NODE_ENV=local FOO=bar BAZ=foo "tsnd" "path/to/mycode.ts"
可见tsnd的--inspect --respawn参数被丢弃,且tsnd命令和文件路径被自动添加引号,引发本地开发故障。
但直接执行tsnd --inspect --respawn path/to/mycode.ts时,参数正常保留且无额外引号,运行符合预期。
解决方案
方法1:用--传递参数给目标命令
npm脚本中,给npm run调用的后续命令传参必须用--分隔,否则参数会被识别为npm run自身的参数。修改local:dev脚本:
"local:dev": "npm run define:local -- tsnd --inspect --respawn path/to/mycode.ts"
这里的--会让npm把后面的所有内容作为参数传递给define:local执行的命令,确保tsnd的参数被完整保留。
方法2:直接合并环境变量与tsnd命令
如果不需要单独保留define:local脚本,可直接将环境变量定义和tsnd命令写在同一个脚本里,避免参数传递问题:
"local:dev": "cross-env NODE_ENV=local FOO=bar BAZ=foo tsnd --inspect --respawn path/to/mycode.ts"
这种写法更直接,环境变量会直接作用于后续的tsnd命令,无需依赖npm的参数传递逻辑。
方法3:使用npm-run-all串行执行(可选)
若需要保留独立的环境变量定义脚本,可安装npm-run-all(npm install npm-run-all --save-dev),用其提供的run-s命令串行执行,同样需用--传递参数:
"define:local": "cross-env NODE_ENV=local FOO=bar BAZ=foo", "local:dev": "run-s define:local -- tsnd --inspect --respawn path/to/mycode.ts"
内容的提问来源于stack exchange,提问作者ssdev
相关产品推荐
相关产品推荐

