可以在此处找到早期版本的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?
答案 0 :(得分:25)
VS2017的安装引擎有一个互操作API,可让您查询有关安装VS2017的实例的信息。它有一个NuGet package,甚至a sample如何查询,包括安装路径。要在批处理或PS文件中使用,您可能只需重写示例应用程序并从脚本中调用它以输出所需的信息。
VS设置引擎将其数据存储在%ProgramData%\Microsoft\VisualStudio\Packages\_Instances
下。 VS2017的每个实例都有一个文件夹,在该文件夹中有一个state.json
文件,其中包含有关该安装的信息,包括安装路径。
由于您需要从.json文件中提取信息,因此您可以选择编写从脚本文件中调用的应用程序,或者直接在脚本中提供一些解析逻辑。 这显然是脆弱的,因为JSON架构或文件位置可能会发生变化。
假设您使用的是默认安装路径,您可以在%ProgramFiles(x86)%\Microsoft Visual Studio\
下递归搜索msbuild.exe(似乎每个VS实例都会有32位和64位的msbuild.exe)。这可能是您脚本文件中最容易做到的事情,但确实依赖于默认安装路径(或您希望在其下搜索的任何硬编码路径)。
您可以做的最后一件事是要求开发人员使用(或以某种方式调用)vsdevcmd.bat
来使用VS dev环境。这将使他们的MSBuild以及VS环境中的任何其他工具进入他们的%PATH%。这确实对您的开发团队提出了要求,但始终是官方支持的查找msbuild.exe的方法。
答案 1 :(得分:18)
Microsoft已创建一个工具来查找Visual Studio 2017和更新https://github.com/Microsoft/vswhere
的位置this博客文章中描述了该选项和更新版本。
答案 2 :(得分:7)
最简单的方式......
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe
答案 3 :(得分:6)
发布此信息的人仍在尝试在计算机上找到最新版本的msbuild,如果可以使用,则可以回退到较旧版本的msbuild。我发现这个powershell片段可以解决问题,很容易invoked from a bat file。
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
答案 4 :(得分:4)
现在VS 2017已经发布,认为增加2美分可能有用:
创建批处理文件:
打开记事本
复制以下内容并粘贴到记事本中,用[我的解决方案名称]替换您要构建的解决方案:
@echo off
:variables
SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
SET solutionDirectory=[My Solution Location Here]
SET batchFileLocation=[BatchFileLocation Here]
cd %solutionDirectory%
echo Building MS files for [My Solution Name Here].
call %msBuildLocation% [My Solution Name].sln /p:Configuration=Debug /m:4 /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false /consoleloggerparameters:Summary;ShowTimestamp;ShowEventId;PerformanceSummary
echo -
echo --------Done building [My solution name here].--------------
echo -
cd %batchFileLocation%
使用.bat扩展名将您的批处理文件保存为您想要的任何内容。一定要选择所有文件而不是.txt,否则它将无效。 通过发出保存的cd命令调用批处理文件,它应该可以工作。或者,只需双击。完成。
请注意我的视觉工作室版本是社区;你需要用适当的版本替换路径。
答案 5 :(得分:3)
我还从CI服务器上的bat文件运行构建工具:我找到的新位置是:
%programfiles(x86)%\ Microsoft Visual 工作室\ 2017 \编译工具\的MSBuild \ 15.0 \ BIN \ msbuild.exe
答案 6 :(得分:1)
如果您已安装.NET Core工具预览版3或更高版本,则dotnet
CLI默认情况下应在%PATH%
上可用(即使您未构建.NET Core项目),所以你可以尝试dotnet msbuild
。参考https://github.com/dotnet/docs/blob/master/docs/core/preview3/tools/dotnet-msbuild.md
答案 7 :(得分:1)
我维护一个非常简单的PowerShell脚本(gist),以使用正确配置的Visual Studio环境变量来运行CI / CLI构建。它使用vswhere.exe
和VsDevCmd.bat
。作为Azure DevOps管道的一部分,它在构建代理上运行良好。特别是对于C ++项目,至关重要的是正确设置INCLUDE
和LIB
,这就是VsDevCmd.bat
的作用。
例如,使用MSBuild
运行当前文件夹中解决方案的构建:
powershell -f _invoke-build.ps1 -buildCommand "msbuild ."
将VS'INCLUDE
环境变量复制到剪贴板中(出于娱乐目的):
powershell -f _invoke-build.ps1 -buildCommand "set INCLUDE | clip"
脚本的当前版本:
<#
.Synopsis
Find Visual Studio and run its VsDevCmd.bat, then run a build command.
.Example
powershell -f _invoke-build.ps1 -buildCommand "msbuild ."
.Link
https://gist.github.com/noseratio/843bb4d9c410c42081fac9d8b7a33b5e
#>
#Requires -Version 5.0
# by @noseratio
param([Parameter(Mandatory = $true)] [string] $buildCommand)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
echo "Building via '$buildCommand' ..."
$vs_not_found = "Visual Studio hasn't been detected!"
$vswhere = "${env:ProgramFiles(x86)}/Microsoft Visual Studio/Installer/vswhere.exe"
if (!(Test-Path $vswhere)) { throw $vs_not_found }
$vs_ide_path = $(& $vswhere -format value -property productPath)
if (!(Test-Path $vs_ide_path)) { throw $vs_not_found }
$vs_ide_folder = "$(Split-Path $vs_ide_path)"
$vs_dev_cmd = "$vs_ide_folder/../Tools/VsDevCmd.bat"
$invoke = "call ""$vs_dev_cmd"" && cd ""$pwd"" && $buildCommand"
# we need to run via CMD for proper propagation of Visual Studio environment vars
& $env:comspec /s /c ""$invoke""
if (!$?) { throw "Failed with error code: $LastExitCode" }
答案 8 :(得分:-1)
所以我有社区版2017,对我来说路径是: C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ MSBuild \ 15.0 \ Bin \
这个帖子上的其他解决方案让我异常。