如何从 Visual Studio 2017(基于目录的项目)中的任意构建任务运行 bash?

bah*_*rep 3 bash visual-studio windows-10 windows-subsystem-for-linux visual-studio-2017

我正在尝试启用自定义构建任务以使用 bash 在 Visual Studio 2017 中构建基于 DocBook 的文档。我在 Windows 10 中使用内置的适用于 Linux 的 Windows 子系统。我可以启动 cmd.exe 并dir按照 MS 的示例运行。但是,我需要make ARGS在 bash 中运行,这就是我失败的地方:

  '"bash"' is not recognized as an internal or external command,
  operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

我可以交互地运行 cmd.exe 并启动 bash 没有任何问题。但它在 Visual Studio 中失败。VS2017 是否使用了一些特殊的环境?如何让它通过这些任务运行 bash?我想我错过了一些非常简单和微不足道的东西,但我不知道从哪里看。

本质上,我想make all-html针对我的 DocBook 源的路径运行命令。

这是一个最小任务示例:

{
  "version": "0.2.1",
  "tasks": [
    {
      "taskName": "Build all-html",
      "appliesTo": "*",
      "type": "command",
      "command": "bash"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

dav*_*dem 6

该命令不会bash像您期望的那样自然找到的原因是因为 Visual Studio 是一个 32 位程序。这意味着当您指定命令时它不会使用 64 位 cmd.exe。

您可以通过打开 32 位命令窗口C:\Windows\SysWOW64\cmd.exebash从那里尝试命令来重现 Visual Studio 正在执行的操作。

解决方法是bash.exe直接通过C:\Windows\Sysnative虚拟文件夹调用。

您可以在 Windows GitHub 上的官方 Bash 中找到有关 Sysnative 文件夹的讨论/解释以及为什么需要它。

这是一个应该适合您的示例命令:

{
  "taskName": "print-pwd",
  "appliesTo": "*",
  "type": "command",
  "command": "%WINDIR%\\Sysnative\\bash.exe",
  "args": [
    "-c",
    "pwd"
  ]
}
Run Code Online (Sandbox Code Playgroud)