如何在NestJS命令中正确使用--exec选项?
问题
想要在NestJS服务启动前通过--exec选项执行指定脚本(基于--require),需要修改package.json中的start:dev脚本。单独执行npx ts-node --require ./src/common/telemetry/telemetry.ts ./src/main.ts可以正常运行,但尝试以下两种配置写法时均失败,出现ARG_UNKNOWN_OPTION错误,错误提示未知选项--enable-source-maps:
尝试的两种配置:
"start:dev": "nest start --watch --exec \"ts-node --require ./src/common/telemetry/telemetry.ts\"", "start:dev": "nest start --watch --exec ts-node --require ./src/common/telemetry/telemetry.ts",
错误详情:
Error: Unknown or unexpected option: --enable-source-maps at arg (C:\Users\jerom\dev\stelogy\apiLeoniJira\node_modules\arg\index.js:88:19) at parseArgv (C:\Users\jerom\dev\stelogy\apiLeoniJira\node_modules\ts-node\dist\bin.js:69:12) at main (C:\Users\jerom\dev\stelogy\apiLeoniJira\node_modules\ts-node\dist\bin.js:25:18) at Object.<anonymous> (C:\Users\jerom\dev\stelogy\apiLeoniJira\node_modules\ts-node\dist\bin.js:579:5) at Module._compile (node:internal/modules/cjs/loader:1546:14) at Module._extensions..js (node:internal/modules/cjs/loader:1691:10) at Module.load (node:internal/modules/cjs/loader:1317:32) at Module._load (node:internal/modules/cjs/loader:1127:12) at TracingChannel.traceSync (node:diagnostics_channel:315:14) at wrapModuleLoad (node:internal/modules/cjs/loader:217:24) { code: 'ARG_UNKNOWN_OPTION' }
解决方案
问题根源是Nest CLI会自动给--exec后的命令追加--enable-source-maps参数,但这个参数要么对当前使用的ts-node版本无效,要么参数传递逻辑混乱导致ts-node识别错误。提供两种可行的解决方式:
方式一:用shell包裹命令避免参数混乱
修改package.json中的start:dev脚本:
- Linux/macOS环境:
"start:dev": "nest start --watch --exec \"bash -c 'ts-node --require ./src/common/telemetry/telemetry.ts $0'\""
- Windows环境:
"start:dev": "nest start --watch --exec \"cmd /c \"ts-node --require ./src/common/telemetry/telemetry.ts %%0\"\""
这种方式通过shell命令包裹,Nest CLI追加的入口文件路径会被正确解析为$0(或Windows下的%%0),ts-node不会收到不属于它的--enable-source-maps参数。
方式二:通过tsconfig配置预加载脚本
直接在tsconfig.json中添加ts-node配置,不需要修改启动命令:
// tsconfig.json { "compilerOptions": { // 原有编译配置... }, "ts-node": { "require": ["./src/common/telemetry/telemetry.ts"] } }
然后start:dev脚本保持默认即可:
"start:dev": "nest start --watch"
这种方式更简洁,ts-node会在启动时自动加载指定的脚本,完全规避命令行参数传递的问题。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

