如何从BAT文件中调用Visual Studio 2017 RC版本的MSBuild?

Arv*_*rve 45 msbuild visual-studio-2017

可以在此处找到早期版本的MSBuild: %programfiles(x86)%\msbuild\<version>\bin\msbuild.exe.

但对于Visual Studio 2017RC来说,路径是%programfiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe.安装类型:enteprise,社区或专业,似乎是路径的一部分.这使得很难在BAT文件中指定msbuild的正确路径,该文件应该适用于具有不同版本的Visual Studio 2017的许多不同计算机.

从bat文件中调用Visual Studio 2017 RC版本的Msbuild的最佳方法是什么?还是来自PowerShell?

Jim*_*mmy 25

支持的方式

VS2017的设置引擎有一个互操作API,允许您查询有关VS2017的哪些实例的安装信息.它有一个NuGet包,甚至还有一个如何查询的示例,包括安装路径.要在批处理或PS文件中使用,您可能只需重写示例应用程序并从脚本中调用它以输出所需的信息.

没有支持的方式

VS设置引擎保存其数据存储%ProgramData%\Microsoft\VisualStudio\Packages\_Instances.VS2017的每个实例都有一个文件夹,该文件夹中的state.json文件包含有关该安装的信息,包括安装路径.

由于您需要从.json文件中提取信息,因此您可以选择编写从脚本文件中调用的应用程序,或者直接在脚本中提供一些解析逻辑. 这显然是脆弱的,因为JSON模式或文件位置可能会更改.

蛮力方法

假设您使用的是默认安装路径,您可以在下面递归搜索msbuild.exe %ProgramFiles(x86)%\Microsoft Visual Studio\(似乎每个VS实例都会有32位和64位的msbuild.exe).这可能是您脚本文件中最容易做到的,但确实依赖于默认安装路径(或您希望在其下搜索的任何硬编码路径).

更改您的开发环境要求

你可以做的最后一件事是要求devs使用(或以某种方式调用)vsdevcmd.bat来使用VS dev环境.这将使他们的MSBuild以及VS环境中的任何其他工具进入他们的%PATH%.这确实对您的开发团队提出了要求,但始终是官方支持的查找msbuild.exe的方法.


Arv*_*rve 18

Microsoft已经创建了一个工具来查找Visual Studio 2017和更新的位置https://github.com/Microsoft/vswhere

博客文章中描述了选项和更新版本.

  • 天哪,他们真的搞砸了......感谢链接(PowerShell部分,顶部,最适合我的构建). (3认同)

Chr*_*Kee 8

最简单的方式......

在VS的下载页面的底部

  • 利润; 构建工具将安装到一个单独的位置,无论您的VS SKU(专业/企业/社区都安装到不同的路径),您安装它的地方都是标准的
  • 新的位置 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe


ala*_*ree 6

发布此信息的人仍在尝试在计算机上找到最新版本的msbuild,如果可以使用,则可以回退到较旧版本的msbuild.我发现这个powershell的片段可以解决这个问题,可以很容易地从bat文件中调用它.

Function Find-MsBuild([int] $MaxVersion = 2017)
{
    $agentPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe"
    $devPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe"
    $proPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe"
    $communityPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
    $fallback2015Path = "${Env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe"
    $fallback2013Path = "${Env:ProgramFiles(x86)}\MSBuild\12.0\Bin\MSBuild.exe"
    $fallbackPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319"

    If ((2017 -le $MaxVersion) -And (Test-Path $agentPath)) { return $agentPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $devPath)) { return $devPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $proPath)) { return $proPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $communityPath)) { return $communityPath } 
    If ((2015 -le $MaxVersion) -And (Test-Path $fallback2015Path)) { return $fallback2015Path } 
    If ((2013 -le $MaxVersion) -And (Test-Path $fallback2013Path)) { return $fallback2013Path } 
    If (Test-Path $fallbackPath) { return $fallbackPath } 

    throw "Yikes - Unable to find msbuild"
}


$msbuildPath = Find-MsBuild 2017
Run Code Online (Sandbox Code Playgroud)