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
最简单的方式......
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe发布此信息的人仍在尝试在计算机上找到最新版本的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)