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. 安装类型:企业、社区或专业,似乎是路径的一部分。这使得在 BAT 文件中指定 msbuild 的正确路径变得困难,该文件应该在具有不同版本 Visual Studio 2017 的许多不同计算机上工作。

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

4

9 回答 9

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)。这可能是在您的脚本文件中最容易做到的,但确实依赖于默认安装路径(或您希望在其下搜索的任何硬编码路径)。

更改您的开发环境要求

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

于 2016-11-20T09:36:32.527 回答
18

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

博客文章中描述了该选项和更新选项。

于 2017-03-10T13:32:56.373 回答
8

最简单的方法...

就在 VS 下载页面的底部

  • 利润; 无论您的 VS SKU 是什么,构建工具都将安装到一个单独的位置,这是您安装它的任何地方的标准(专业/企业/社区都安装到不同的路径)
  • 新地点C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe
于 2017-06-05T12:07:00.070 回答
8

为仍在尝试在机器上找到最新版本的 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
于 2017-09-19T15:26:16.423 回答
4

现在 VS 2017 已经发布了,我觉得加我的 2 美分可能会有用:

创建批处理文件:

打开记事本

复制以下内容并粘贴到记事本中,将您要构建的解决方案替换为 [My Solution Name Here]:

@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 版本是社区版;您需要将路径替换为适当的版本。

于 2017-03-15T15:37:14.207 回答
3

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

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

于 2017-03-15T21:34:45.467 回答
1

如果您已安装 .NET Core 工具预览版 3 或更高版本,则默认情况下dotnetCLI 应该可用%PATH%(即使您没有构建 .NET Core 项目),因此您可以尝试dotnet msbuild. 参考https://github.com/dotnet/docs/blob/master/docs/core/preview3/tools/dotnet-msbuild.md

于 2017-02-07T18:00:55.323 回答
1

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

于 2020-09-29T04:11:09.207 回答
-1

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

该线程上的其他解决方案向我抛出了异常。

于 2018-01-25T19:28:10.150 回答