MSBuild с VS 2017 BuildTools установил неправильный $ (VSInstallDir) во время сборки - PullRequest
0 голосов
/ 12 сентября 2018

Я вижу странное поведение с последними 15.8.2 Visual Studio 2017 Build Tools.После установки инструментов и обеспечения установки всех рабочих нагрузок и компонентов я попытался создать наше мастер-решение из командного файла с помощью следующей команды:

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'.

Если вы заметите, путь, который не может быть найден, ищет каталог «Enterprise», который явно нене существует, потому что мы установили инструменты сборки..Dll, о котором идет речь, находится в правильном каталоге, прямо в папке «BuildTools», а не «Enterprise».В самом проекте у нас есть эта строка для приведенного выше .dll:

<HintPath>$(VSInstallDir)\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\Microsoft.SqlServer.TransactSql.ScriptDom.dll</HintPath>

При просмотре командной строки разработчика в системе с установленными только инструментами сборки, работающей set, переменная VSInstallDir правильно отображается в папку BuildTools:

VSINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\

Мой вопрос заключается в следующем: откуда в мире MSBuild получает каталог "Enterprise"?Мы не ссылаемся на него в ЛЮБОМ проекте, вместо этого используем $ (VSInstallDir) при необходимости.Я извлек весь каталог BuildTools для ссылок на «Enterprise», и я не нахожу ничего в файлах .targets или .props (или в действительности в любых других файлах), которые указывали бы на то, что переменная будет преобразована в «Enterprise», а не «BuildTools».

...