[英]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.