2017-03-08 108 views
13

在Visual Studio 2015中,我使用的NuGet包Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0允许我在每次构建项目时直接从MSBuild转换T4模板。MSBuild支持Visual Studio 2017 RTM中的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包,我可以看到。

我该怎么做T4转换从MSBuild将适用于VS 2017?是否会有NuGet的新软件包在某个时候使用或者不再支持?

回答

18

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

原来,T4 SDK现在作为Visual Studio 2017的一部分包含在内(而不是以前的单独建模SDK的一部分),但是您必须通过VS2017中的Visual Studio extension development工具集进行安装安装程序(文本模板转换功能)。

一旦被安装,你可以使用的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包的需要。

+0

很高兴知道您已解决此问题。请标记您的答案,这对其他有相同问题的社区是有好处的。 –

+0

这帮了我很大的忙(谢谢!),但我想指出它只适用于.NET Framework项目,而不是.NET标准项目,至少现在只是FYI。 –

+1

@JorgeYanesDiez,可能你需要'而不是'Microsoft.CSharp.targets'。在http://webcache.googleusercontent.com/search?q=cache:http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/&gws_rd上查看我的评论和OP的回复= cr&ei = yo9TWbKIPMS0aY_zqJAB –

-2

我有一个类似的问题,我的Visual Studio Team Service上的托管代理没有生成模板输出,因此,由于缺少生成的CS文件而中断了构建服务器。

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

看看上面的各种解决方案,我很清楚,更方便的解决方法是将提交到我的源代码管理系统。这还有一个好处,我可以编写代码来查看输出中的任何更改,而不仅仅是模板。

+1

是的,但是如果生成的代码不是最新的,这很容易导致问题 - 例如,开发人员忘记编译或重新运行T4模板在提交更改之前手动完成,这意味着生成的源在源代码管理中现在可能已过时。除非可以确保生成的源始终与其输入保持最新,否则只需将其置入源代码管理是不够的。这就是为什么能够在构建上运行模板非常重要。 – Sam

+0

可以很容易地注意到输出不会通过代码评论更新。但是你是对的,这只是一个解决方法,只适用于我猜想的非常小的项目。 Mine是一个只有几个生成的CS文件的单人项目。 – Slion

+0

我们生成的一些文件包含数百或数千行 - 即使您可以看到差异,您也不会在人眼中发现错误! – Sam