MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板

Posted

技术标签:

【中文标题】MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板【英文标题】:MSBuild support for T4 templates in Visual Studio 2017 RTM 【发布时间】:2017-07-28 11:17:44 【问题描述】:

在 Visual Studio 2015 中,我使用 NuGet 包 Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0,它允许我在构建项目时直接从 MSBuild 转换 T4 模板。

然而,在 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 的更新包。

如何从适用于 VS 2017 的 MSBuild 进行 T4 转换?是否会在某个时候使用来自 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 包。

【讨论】:

很高兴知道您已解决此问题。请标记您的答案,这对遇到相同问题的其他社区有好处。 这对我有很大帮助(谢谢!),但我想指出它仅适用于 .NET Framework 项目,而不适用于 .NET Standard 项目,至少按原样仅供参考。 @JorgeYanesDiez,可能你需要&lt;Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /&gt; &lt;Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /&gt; 而不是Microsoft.CSharp.targets。请参阅我的 cmets 和 OP 回复 webcache.googleusercontent.com/search?q=cache:http://… 有谁知道如何在构建服务器上使用 msbuild? 我的变量 $(VSToolsPath) 解析为:C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0。安装 VS 和文本模板转换后,我的目标文件位于此处:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating 想知道完全相同的设置为什么我的路径无法正确解析。非常感谢任何帮助或想法。【参考方案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】:

我遇到了类似的问题,我的 Visual Studio Team Service 上的托管代理没有生成模板输出,因此破坏了我的构建服务器,因为它缺少生成的 CS 文件。

在我的开发机器上从 Visual Studio 2015 构建时,CS 模板输出生成得很好。

查看各种解决方案,例如上面的解决方案,我很清楚,更方便的解决方法是将生成的文件提交到我的源代码控制系统。这还有一个额外的好处,即我可以对输出中的任何更改进行代码审查,而不仅仅是模板。

【讨论】:

是的,但是如果生成的代码不是最新的,这很容易导致问题 - 例如,开发人员在提交更改之前忘记手动构建或重新运行 T4 模板,这意味着生成的源代码现在在源代码控制中也可能过时。除非您可以确保生成的源代码在其输入方面始终是最新的,否则仅将其放入源代码控制是不够的。这就是为什么能够在构建时运行模板如此重要的原因。 人们很容易注意到输出没有通过代码审查更新。但你是对的,我猜这只是一种只对非常小的项目很方便的解决方法。我的是一个单人项目,只有几个生成的 CS 文件。 我们生成的一些文件包含数百或数千行 - 即使您可以看到差异,您也不会用肉眼发现其中的错误!

以上是关于MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild、未解决的外部和 Visual Studio 2005

Visual Studio中的MSBuild项目

为啥 Visual Studio 2010 (msbuild?) 构建速度不快?

MSBuild 是不是需要安装 Visual Studio?

如何只用visual c++编译器而不安装visual studio

网站编译在 MSBuild 中失败,但在 Visual Studio 中有效