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

46

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

但是对于Visual Studio 2017RC,路径为%programfiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe。安装类型:企业版、社区版或专业版似乎是路径的一部分。这使得在许多具有不同版本的Visual Studio 2017的计算机上指定正确的msbuild路径变得困难。

如何从BAT文件或PowerShell调用Visual Studio 2017 RC的Msbuild版本?


最好运行vcvars,因为它通常包含msbuild的路径,或者对于VS2017也有所改变吗? - stijn
vcvars也在“企业版”、“社区版”或“专业版”路径下。因此,调用vcvars与调用msbuild一样未定义。 - Arve
仅限于“Visual Studio 2017RC开发人员命令提示符”。不适用于通用命令提示符。我想分发一个BAT文件,所有开发人员都可以直接运行,无需先执行任何操作。 - Arve
1
也许他们这么做是因为可以在一台机器上安装企业版/社区版/...?无论如何,这样做有点糟糕。希望发布时会有所改变。 - stijn
1
问题是:用户可以安装社区版、专业版或企业版,但目录名称取决于版本。 - linquize
显示剩余2条评论
9个回答

25

官方支持的方法

VS2017的安装引擎有一个Interop API,允许您查询已安装的VS2017实例的信息。有一个NuGet软件包可用,并且包含如何查询,包括安装路径的示例。对于批处理或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开发环境。这将使他们获得MSBuild以及来自VS环境的任何其他工具,并将它们添加到他们的%PATH%中。这确实对您的开发团队有一些要求,但始终是一个官方支持的查找msbuild.exe的方法。


1
另外:如果你在 Visual Studio 命令提示符中运行一个 .bat 文件,msbuild 将会在路径上。 - Michael Braude

18

3
天啊,他们真的把它搞砸了...感谢你提供的链接(最好是顶部的PowerShell部分适用于我的版本)。 - Vimes

8

我遇到了一个问题,BuildTools没有包含SSDT。 SSDT用于构建.sqlproj项目。 - SamuelKDavis
我尝试了这个,但是我的解决方案现在出现了非常基本的关键错误,比如“visual studio命名空间未找到” :S - Yogurtu
@SamuelKDavis https://developercommunity.visualstudio.com/content/problem/166536/ssdt-not-present-in-visual-studio-build-tools-2017.html - Chris McKee

8

为了帮助那些仍在尝试在计算机上找到最新版本的msbuild并回退到旧版本(如果可用),我发布此内容。我发现这段powershell代码可以轻松地从批处理文件中调用

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

谢谢,这非常有帮助。我不得不在结尾添加 echo $msbuildPath 以获取结果。 - Zach Smith

4

现在,Visual Studio 2017已经发布,我觉得添加我自己的想法可能会有所帮助:

创建批处理文件:

打开记事本

复制以下内容并粘贴到记事本中,将要构建的解决方案替换为[我的解决方案名称]:

@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命令调用批处理文件,在你保存它的位置,它应该可以工作。或者,只需双击即可完成。

请注意,我的Visual Studio版本是Community;你需要使用适当的版本替换路径。


3

我还在我的CI服务器上从bat文件运行构建工具:我找到的新位置是这样的:

%programfiles(x86)%\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe


该段文字涉及IT技术,介绍了在CI服务器上运行构建工具的方法,并提供了相应的路径信息。

1

可能不起作用。在我的情况下,这会导致“未找到导入的项目'C:\ Program Files \ dotnet \ sdk \ 2.1.402 \ Microsoft \ VisualStudio \ v15.0 \ Web \ Microsoft.WebSite.Publishing.targets。”也就是说,它正在寻找dotnet安装路径下的MSBuild安装路径,而不是VS安装路径。 - Auspex

1
我维护一个非常简单的PowerShell脚本(gist),用于使用正确配置的Visual Studio环境变量运行CI / CLI构建。它使用vswhere.exeVsDevCmd.bat。它在作为Azure DevOps管道的一部分的构建代理上运行良好。特别是对于C ++项目,正确设置INCLUDELIB非常重要,这就是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" }


-1

所以我有2017年的社区版,对于我来说路径是: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\

这个帖子中的其他解决方案给了我一个异常。


为什么这个被投票否决了?我正想在这里寻找MSBuild。 - Zach Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接