[英]How to execute WSL commands from a node process?
我正在开发一个小型节点构建脚本,我想启动 WSL、cd 到我的项目目录并调用构建命令。 是这样的:
import { exec } from "child_process";
async function execCommand(cmd) {
console.log("Executing: " + cmd);
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) { reject(); }
else { resolve(); }
});
});
}
await execCommand(`wsl`);
await execCommand(`cd /mnt/c/Users/Admin/Documents/Projects/myproject/backend`);
await execCommand(`cargo build --release`);
我的问题是它只是.. 不起作用。 也就是说,第一个execCommand
调用wsl
然后终端 window 似乎永远不会完成命令(它永远不会完成)。
相反,它会提示用户在命令提示符中键入内容。
从节点脚本启动 WSL,然后将一堆命令链接在一起,每个命令都等待前一个命令完成的正确方法是什么?
终于让它工作了。
异步版本:
let child = spawn("wsl", [ "cd", "/mnt/c/Users/Admin/Documents/Projects/myserver/backend", "&&", "cargo", "build", "--release" ], {
cwd: "C:\\Users\\Admin\\Documents\\Projects\\myserver\\backend",
shell: true
});
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
child.stdin.end();
同步版本:
let child = spawnSync("wsl", [ "cd", "/mnt/c/Users/Admin/Documents/Projects/myserver/backend", "&&", "cargo", "build", "--release" ], {
cwd: "C:\\Users\\Admin\\Documents\\Projects\\myserver\\backend",
shell: true
});
console.log(child.stdout.toString());
console.log(child.stderr.toString());
实际上,我的另一个答案不是那么好,因为它启动了一个单独的 shell 并通过cmd
shell 运行命令,因此二进制文件将由 Windows 而不是 WSL 构建,这不是我们想要的。 更好的答案是:
let child = spawnSync("wsl", [ "bash", "-l", "-c", "cargo build --release" ], {
cwd: "C:\\Users\\Admin\\Documents\\Projects\\myserver\\backend"
});
console.log(child.stdout.toString());
console.log(child.stderr.toString());
您需要包含bash -l
,因为当您通过wsl
运行命令时,它不会执行~/.profile
和~/.bashrc
(等)。 Cargo 需要它,所以它可以将~/.cargo/bin
插入到$PATH
中。
因此,使用bash -l
可以强制它执行配置文件初始化脚本。 当您在没有任何其他命令的情况下启动 WSL 时,它将以交互方式登录,这意味着这些脚本将被执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.