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

时间:2017-08-21 07:54:17

标签: bash visual-studio windows-10 visual-studio-2017 windows-subsystem-for-linux

我试图让custom build tasks使用bash在Visual Studio 2017中构建基于DocBook的文档。我在Windows 10中使用内置的Windows子系统Linux。我可以启动cmd.exe和像在MS的示例中一样运行dir。但是,我需要在bash中运行make ARGS以及我失败的地方:

  '"bash"' is not recognized as an internal or external command,
  operable program or batch file.

我可以交互式运行cmd.exe并启动bash而不会出现任何问题。但它在Visual Studio中失败了。 VS2017是否使用了一些特殊的环境?如何让它通过这些任务运行bash?我想我错过了一些非常简单和琐碎的事情,但我不明白在哪里看。

基本上,我想使用DocBook源对路径运行make all-html命令。

这是一个最小的任务示例:

{
  "version": "0.2.1",
  "tasks": [
    {
      "taskName": "Build all-html",
      "appliesTo": "*",
      "type": "command",
      "command": "bash"
    }
  ]
}

2 个答案:

答案 0 :(得分:3)

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

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

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

您可以找到Sysnative文件夹的讨论/说明以及必要的原因here in the official Bash on Windows GitHub

以下是一个适合您的示例命令:

{
  "taskName": "print-pwd",
  "appliesTo": "*",
  "type": "command",
  "command": "%WINDIR%\\Sysnative\\bash.exe",
  "args": [
    "-c",
    "pwd"
  ]
}

答案 1 :(得分:1)

在您的链接中,文档提供了一个使用cmd列出输出的示例:您应该使用${env.COMSPEC}来使用cmd.exe,然后将bash作为参数。

{
  "version": "0.2.1",
  "tasks": [
    {
      "taskName": "Build all-html",
      "appliesTo": "*",
      "type": "command",
      "command": "${env.COMSPEC}",
      "args": [
        "bash"
      ]
    }
  ]
}

这是以交互模式运行bash,但您可以使用bash -c这样的bash命令:bash -c 'echo "$PATH"'

注意:这会在解决方案的根目录下运行bash(您可以使用bash -c 'echo $PWD'进行检查。)