it-roy-ru.com

Поддержка MSBuild для шаблонов T4 в Visual Studio 2017 RTM

В Visual Studio 2015 я использую пакет NuGet Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0, который позволяет мне преобразовывать шаблоны T4 непосредственно из MSBuild при создании проекта.

Однако в Visual Studio 2017 RTM это нарушает сборку со следующими сообщениями:

An Exception was thrown while running the transformation code. The process cannot continue. The following Exception was thrown: System.IO.FileNotFoundException: Could not load file or Assembly 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

Это вызывается файлом Unofficial.Microsoft.VisualStudio.TextTemplating.targets(396,5), который находится в этом пакете. 

Я предполагаю, что ошибка возникает из-за попытки использовать эти цели из сборки VS 2017 из-за несоответствия окружения, но я не знаю, как отследить точную проблему. Для v15 пока нет обновленного пакета, который я вижу.

Как я могу сделать преобразования T4 из MSBuild, которые будут работать на VS 2017? Будет ли в какой-то момент новый пакет от NuGet для использования или он больше не будет поддерживаться?

15
Sam

Я нашел правильное решение.

Оказывается, что T4 SDK теперь включен как часть Visual Studio 2017 (а не как часть отдельного Modeling SDK, как это было в прошлом), НО вам нужно установить его с помощью набора инструментов Visual Studio extension development в установщике VS2017 (текстовый шаблон Особенность трансформации).

После установки вы можете использовать MSBuild для преобразования шаблонов, импортировав соответствующие цели в проект MSBuild:

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <TransformOnBuild>True</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

<!-- add AFTER import for $(MSBuildToolsPath)\Microsoft.CSharp.targets -->
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

Это решило мою проблему, а также устранило необходимость в отдельном неофициальном пакете NuGet.

22
Sam

У меня была похожая проблема. Мой Т4 не будет генерироваться при сборке, но будет при сохранении. Это было странно, так как я не получил ошибку, но прочитав ответ Сэма, я понял, что что-то не так с моей установкой VS. И я был прав. VS 2017 15.9.4 устанавливается в своем собственном каталоге установки, но не копирует Tools в папку VSToolsPath. Вместо этого он просто оставляет их там, где они есть. Поэтому для меня правильным решением было использовать это <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(VsInstallRoot)\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets" />

0
Cubelaster