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

17

我在Visual Studio 2015中使用NuGet软件包Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0,使我可以在每次构建项目时直接从MSBuild转换T4模板。

然而,在Visual Studio 2017 RTM中,这会导致以下错误:

运行转换代码时抛出异常。进程无法继续。抛出以下异常: System.IO.FileNotFoundException: 找不到文件或程序集“Microsoft.CodeAnalysis,版本=1.3.1.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其中一个的依赖项。系统找不到指定的文件。 文件名:“Microsoft.CodeAnalysis,版本=1.3.1.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”

这是由此软件包中的文件Unofficial.Microsoft.VisualStudio.TextTemplating.targets(396,5)引起的。

我猜测错误是由于尝试从VS 2017构建中使用这些目标导致环境不匹配,但我不知道如何跟踪确切的问题。我看不到适用于v15的更新包。

如何进行T4转换以使其在VS 2017上工作?是否会有新的NuGet软件包在某个时间点提供支持,还是不再支持此功能?

4个回答

26

我找到了正确的解决方案。

原来T4 SDK已经作为Visual Studio 2017的一部分包括在内(而不是像过去那样作为单独的建模SDK的一部分),但您必须通过VS2017安装程序中的Visual Studio extension development工具集进行安装(Text Template Transformation功能)。

安装完成后,您可以通过将相关目标导入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项目,至少目前是这样的,仅供参考。 - Jorge Yanes Diez
1
@JorgeYanesDiez,可能你需要使用<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />代替Microsoft.CSharp.targets。请查看我的评论和原帖回复:http://webcache.googleusercontent.com/search?q=cache:http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/&gws_rd=cr&ei=yo9TWbKIPMS0aY_zqJAB - Peter Taylor
1
有人知道如何在构建服务器上使用msbuild使其正常工作吗? - mirhagk
1
我的变量 $(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由于设置完全相同,我想知道为什么我的路径无法正确解析。非常感谢任何帮助或想法。 - GargantuanTezMaximus
显示剩余4条评论

0

我有一个类似的问题。我的T4在构建时无法生成,但在保存时可以生成。这很奇怪,因为我没有收到错误提示,但在阅读了@Sam的答案后,我发现我的VS安装出了问题。而且我是正确的。VS 2017 15.9.4安装在自己的安装目录中,但不会将工具复制到VSToolsPath文件夹中。相反,它只是把它们留在原地。所以,对我来说,正确的解决方案是使用这个 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(VsInstallRoot)\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets" />


0

T4Executer 可以做到这一点,您可以设置在构建之前或之后执行哪些模板,或者设置哪些模板不应在构建时运行。VS2017-19


-2

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

当我从我的开发机上的Visual Studio 2015进行构建时,CS模板输出就可以正常生成。

通过查看各种解决方案,例如上面的解决方案,我清楚地意识到更快捷的解决方法就是简单地将生成的文件提交到我的源代码控制系统中。这样做的额外好处是,我可以对输出中的任何更改进行代码审查,而不仅仅是模板。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接