如何在Node.js项目中跨目录执行脚本并作用于目标项目?
跨目录执行Node.js项目脚本的解决方案
问题场景
现有两个Node.js项目:
- 项目一:位于
/project/one - 项目二:位于
/project/two
在项目一的JS函数中执行以下代码,意图操作项目二,但实际脚本仍作用于项目一:
const projectTwoPath = "/project/two"; exec(`sh ${projectTwoPath}/projectRun.sh`, ...) exec(`sh ./projectRun.sh`, {cwd: projectTwoPath }, ...)
其中/project/two/projectRun.sh内容为:
npx prisma migrate dev pm2 start npm --name "project-two" -- run start
问题原因
脚本执行时的工作目录是调用它的目录(即/project/one),而非脚本所在目录。因此脚本中的npx、pm2命令会默认读取当前工作目录(项目一)的配置,而非项目二的。
解决方案
1. Linux控制台直接执行
在/project/one目录下,通过切换目录后执行脚本:
cd /project/two && sh projectRun.sh
或使用子shell避免影响当前会话的工作目录:
(sh -c "cd /project/two && ./projectRun.sh")
2. Node.js exec 实现
方法一:先切换目录再执行脚本
const { exec } = require('child_process'); const projectTwoPath = "/project/two"; exec(`cd ${projectTwoPath} && sh projectRun.sh`, (error, stdout, stderr) => { if (error) { console.error(`执行错误: ${error.message}`); return; } if (stderr) { console.error(`错误输出: ${stderr}`); return; } console.log(`执行结果: ${stdout}`); });
方法二:指定exec的工作目录参数
确保cwd参数正确指向项目二目录,脚本路径基于该目录:
const { exec } = require('child_process'); const projectTwoPath = "/project/two"; exec(`sh projectRun.sh`, { cwd: projectTwoPath }, (error, stdout, stderr) => { if (error) { console.error(`执行错误: ${error.message}`); return; } if (stderr) { console.error(`错误输出: ${stderr}`); return; } console.log(`执行结果: ${stdout}`); });
3. Node.js shelljs 实现
const shell = require('shelljs'); const projectTwoPath = "/project/two"; // 切换到项目二目录并执行脚本 shell.cd(projectTwoPath); const runResult = shell.exec('sh projectRun.sh'); if (runResult.code !== 0) { console.error(`脚本执行失败: ${runResult.stderr}`); } else { console.log(`脚本执行成功: ${runResult.stdout}`); }
4. 优化脚本本身(推荐)
修改/project/two/projectRun.sh,在开头自动切换到脚本所在目录,这样无论从哪里执行脚本,都会作用于项目二:
#!/bin/bash # 切换到脚本所在的目录 cd "$(dirname "$0")" npx prisma migrate dev pm2 start npm --name "project-two" -- run start
内容的提问来源于stack exchange,提问作者Van Hemer
相关产品推荐
相关产品推荐

