我看到最新的 15.8.2 Visual Studio 2017 构建工具出现了一些奇怪的行为。安装工具并确保它已安装所有工作负载和组件后,我尝试使用以下命令从批处理文件构建我们的主解决方案:
msbuild %~dp0\..\..\Master.sln /verbosity:quiet /ds /p:Configuration=Debug;Platform=x64 /m /fl1 /fl2 /fl3 /flp1:LogFile="%~dp0\MSBuild.log";Verbosity=normal /flp2:LogFile="%~dp0\ProjectWarnings.log";WarningsOnly /flp3:LogFile="%~dp0\ProjectErrors.log";ErrorsOnly
第一个项目失败并出现以下错误:
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets(340,5): error : System.IO.FileNotFoundException: Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\Microsoft.SqlServer.TransactSql.ScriptDom.dll'.
如果您注意到,找不到的路径是在寻找“企业”目录,该目录显然不存在,因为我们安装了构建工具。有问题的 .dll 位于正确的目录中,就在“BuildTools”文件夹下,而不是“Enterprise”下。在项目本身中,我们为上述 .dll 提供了这一行:
<HintPath>$(VSInstallDir)\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\Microsoft.SqlServer.TransactSql.ScriptDom.dll</HintPath>
在仅安装 Build Tools 的系统上查看开发人员命令提示符时set
,该变量VSInstallDir
正确映射到 BuildTools 文件夹:
VSINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\
我的问题是:MSBuild 从哪里获得“企业”目录?我们没有在任何项目中引用它,而是在必要时使用 $(VSInstallDir)。我已经 grep 了整个 BuildTools 目录以获取对“Enterprise”的引用,并且在 .targets 文件或 .props(或实际上任何其他文件)中找不到任何表明该变量将解析为“Enterprise”而不是“BuildTools”的内容。