Поддержка 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 для использования или он больше не будет поддерживаться?
2 ответа
Я нашел правильное решение.
Оказывается, что 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.
У меня была похожая проблема. Мой Т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" />
T4Executer делает это, и вы можете указать, какие шаблоны следует исключать до сборки или после сборки, или указать, какие шаблоны не должны запускаться при сборке. VS2017-19
У меня была похожая проблема, когда мой размещенный агент в Visual Studio Team Service не генерировал выходные данные шаблона, что повредило мой сервер сборки, поскольку в нем отсутствовали сгенерированные файлы CS.
Вывод шаблона CS генерируется просто отлично при сборке из Visual Studio 2015 на моей машине для разработки.
Глядя на различные решения, такие как приведенное выше, мне стало ясно, что более целесообразным решением было бы просто зафиксировать сгенерированные файлы в моей системе контроля версий. Это дает дополнительное преимущество, заключающееся в том, что я могу анализировать любые изменения в выводе, а не только в шаблоне.