簡體   English   中英

如何從節點進程執行 WSL 命令?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM