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

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

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

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 использоваться в какой-то момент или это больше не будет поддерживаться?

Ответ 1

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

Оказывается, что T4 SDK теперь включен как часть Visual Studio 2017 (а не часть отдельного 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.

Ответ 2

У меня была похожая проблема. Мой T4 не будет генерироваться при сборке, но будет при сохранении. Это было странно, так как я не получил ошибку, но прочитав ответ @Sam, я понял, что что-то не так с моей установкой 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"/>

Ответ 3

T4Executer делает это, и вы можете указать, какие шаблоны использовать перед сборкой или после сборки, или указать, какие шаблоны не следует запускать при сборке. VS2017-19

Ответ 4

У меня была аналогичная проблема, в которой мой Hosted Agent в Visual Studio Team Service не генерировал выход шаблона, тем самым нарушая работу моего сервера сборки, так как ему не хватало сгенерированные файлы CS.

Выход шаблона CS генерируется просто при создании из Visual Studio 2015 на моей машине разработки.

Посмотрев на различные решения, такие как выше, мне стало ясно, что более целесообразным решением было просто зафиксировать сгенерированные файлы в моей системе управления версиями. У этого есть дополнительное преимущество, что я могу закодировать обзор любых изменений в выходе, а не только шаблона.