使用Visual Studio 2017和MSBuild 15.0,通过在根目录中放置Directory.Build.props和/或Directory.Build.targets文件,引入了一项新功能,以扩展中心位置解决方案中所有项目的构建过程解决方案的文件夹(* sln文件所在的文件夹)。
不幸的是,这个强大的功能不适用于较旧的VS和MSBuild版本。有没有办法让VS 2015和MSBuild 14.0中的全局构建配置与VS 2017和MSBuild 15.0类似?
答案 0 :(得分:1)
在研究了MSBuild如何工作之后,我发现MSBuildToolsPath目录中有Microsoft.Common.targets文件(例如C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin),MSBuild在每个目录中使用它建立。
当我比较MSBuild 14.0和MSBuild 15.0的Microsoft.Common.targets文件时,结果发现它们几乎相同。主要区别在于,15.0文件包含一些逻辑来发现Directory.Build.targets文件的路径,如果存在这样的文件,则此文件中的构建目标也包含在构建中。
Differences of MSBuild 14.0 and 15.0 Microsoft.Common.targets files
*重要提示*
以下解决方案更改了MS Visual Studio安装的某些部分,可能会导致不可预见的严重影响。一般来说,这是危险的,完全没有支持,并可能打破各种各样的事情。
如果您完全确定自己在做什么,请继续。
我的解决方案只是将包含Directory.Build.targets文件的部分从MSBuild 15.0 Microsoft.Common.targets文件粘贴到MSBuild 14.0 Microsoft.Common.targets文件中。但是,用15.0文件替换14.0文件也应该是安全的。 可以找到当前版本的Microsoft.Common.targets文件here
要自动执行此过程并在其他开发计算机上重复此过程,我制作了此Windows批处理文件,该文件发现MSBuildTools路径并用更新的文件替换Microsoft.Common.targets文件。我在此批处理脚本中使用的更新文件名为MSBuil15.Microsoft.Common.targets,并且必须与批处理文件位于同一文件夹中。此批处理文件基于MSBuildPath.bat和GotAdmin.bat,其中我添加了两行代码来替换文件。
@echo off
reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath > nul 2>&1
if ERRORLEVEL 1 goto MissingMSBuildRegistry
for /f "skip=2 tokens=2,*" %%A in ('reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath') do SET "MSBUILDDIR=%%B"
echo.
echo MSBuildToolsPath: %MSBUILDDIR%
echo.
IF NOT EXIST "%MSBUILDDIR%" goto MissingMSBuildToolsPath
IF NOT EXIST "%MSBUILDDIR%msbuild.exe" goto MissingMSBuildExe
IF EXIST "%MSBUILDDIR%Microsoft.Common.targets.bak" goto AlreadyPatched
::-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
::--------------------------------------
:: Replace MSBuild 14.0 Microsoft.Common.targets file with MSBuild 15.0 file.
rename "%MSBUILDDIR%Microsoft.Common.targets" "Microsoft.Common.targets.bak"
copy "MSBuil15.Microsoft.Common.targets" "%MSBUILDDIR%Microsoft.Common.targets"
exit /b 0
goto:eof
::ERRORS
::---------------------
:MissingMSBuildRegistry
echo Cannot obtain path to MSBuild tools from registry
goto:eof
:MissingMSBuildToolsPath
echo The MSBuild tools path from the registry '%MSBUILDDIR%' does not exist
goto:eof
:MissingMSBuildExe
echo The MSBuild executable could not be found at '%MSBUILDDIR%'
goto:eof
:AlreadyPatched
echo The Microsoft.Common.targets file is already patched
goto:eof