如何遵循DRY原则实现npm脚本的工作目录切换
解决方案
方案1:抽离公共路径到package.json config字段(推荐,改动最小)
npm会自动将package.json内的字段注入为脚本执行时的环境变量,你可以把公共路径单独定义在config块,全局只需要维护这一处路径:
{ "name": "your-project", "config": { "workDir": "src/path/to/my/work/dir/" }, "scripts": { "task:1": "cd $npm_package_config_workDir && command1", "task:2": "cd $npm_package_config_workDir && command2" } }
- 类Unix系统(macOS/Linux/WSL):直接用
$npm_package_config_workDir调用变量即可 - Windows cmd环境:将变量写法替换为
%npm_package_config_workDir% - 跨平台兼容需求:安装轻量工具
cross-var,脚本写法改为cross-var cd $npm_package_config_workDir && command1即可兼容所有系统
方案2:封装统一执行入口(零重复,适合多任务场景)
如果你的任务数量很多,不想给每个任务加cd前缀,可以封装一个公共的执行脚本,利用npm内置的$INIT_CWD变量定位项目根目录的package.json:
{ "scripts": { "exec": "cd src/path/to/my/work/dir/ && npm run --prefix $INIT_CWD", "task:1": "command1", "task:2": "command2" } }
执行任务时用npm run exec -- task:1的格式调用即可,路径修改只需要调整exec脚本里的cd路径,所有任务本身完全不用改动。
补充说明
你最开始的方案失效是因为每执行一次npm run都会启动独立的shell子进程,子进程的工作目录修改不会传递到其他进程,所以分开写的cd脚本无法对后续任务生效。
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

