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

时间:2016-11-19 15:28:32

标签: 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?

9 个答案:

答案 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)

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

Right at the bottom of the download page on VS

  • 利润;无论您的VS SKU(专业/企业/社区都安装到不同的路径),构建工具都将安装到一个单独的位置,无论您在哪里安装它都是标准的。
  • 新位置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.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" }

答案 8 :(得分:-1)

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

这个帖子上的其他解决方案让我异常。