繁体   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