2017-03-08 80 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