我正在尝试将一些代码生成模板连接到我团队的自动构建过程。我们的 SCM 团队不希望在我们的构建机器上使用 Visual Studio(对此我很难争论)。
有没有办法在没有Visual Studio的情况下安装T4引擎?
我为 MonoDevelop IDE 编写了一个完全逆向工程的 T4 引擎实现。它是开源的,根据宽松的 MIT/X11 许可证获得许可,因此您可以自由地将引擎嵌入到您的应用程序中或重新分发它。还有 TextTransform.exe 命令行工具的实现可用作 dotnet 全局工具,以及 Mono.TextTemplate 命名空间中的一些 API 来帮助托管引擎。
您可以从 NuGet 获取软件包 并且 源位于 GitHub 上。
我们实际上并没有生成代码...我们正在生成 Sandcastle 脚本,并且我们绝对希望在构建服务器上完成该操作。我们采用了一种方法,创建了一系列自定义属性,用这些属性来装饰我们的代码,以决定文档的生成方式。因此,我们有一组 .tt 文件来反映这些属性的程序集,并生成 Sandcastle 的输入文件 (.shfb)。我本可以使用自定义工具来完成此操作,但 T4 非常适合。
无论如何...我已经确认您可以在没有 Visual Studio 的情况下运行 TextTransform.exe。您所需要的只是 Microsoft.VisualStudio.TextTemplated.dll 存在。我创建了一个新的 VM,安装了 .NET 3.5,并将以下内容复制到文件系统:
Test.tt 看起来像这样:
<#@ template language="C#3.5" debug="true" hostspecific="true" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections"#>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.Xml" #>
<#@ output extension=".cs" #>
测试: <#=System.DateTime.Now.ToString()#>....
从虚拟机中我执行了 Test.tt,如下所示:
C:\TextTransform.exe 测试.tt
并且创建的 Test.cs 包含
测试:2009年6月10日下午5:33:32....
胜利!!!
最难的部分是找到 Microsoft.VisualStudio.TextTemplated.dll。我必须启动 FileMon 并在装有 Visual Studio 的盒子上执行一个模板。然后 FileMon 告诉我 TextTransform.exe 从哪里加载它。这可能存在于多个地方,但我在 GAC 中的 C:\Windows ssembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplated\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplated.dll 中找到了它。为了使用 Windows 资源管理器浏览到该位置,我必须创建一个如下所示的子目录:
subst X: C:\Windows sembly
然后我可以浏览到 X:\Windows ssembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplated\9.0.0.0__b03f5f7f11d50a3a\ 并复制 dll。
无论如何...谢谢你的想法。希望有一天这能帮助其他可怜的灵魂:)
这就是我最终采取的方法:
我有一台带有 Visual Studio 2010 sp1 的开发机器和一台构建机器(使用 msbuild)。
祝你一切顺利,可以出发了。
进一步阅读:
我还没有尝试过,但我相信您能够使用命令行工具,将其放在构建服务器上,并在构建之前/期间转换您的模板。
我的理解是您仍然需要安装 Visual Studio。为什么要逆流而行呢?您是否考虑过在设计时而不是构建时生成代码?
12份只需复制
C:\Program Files (x86)\Common Files\Microsoft Shared\TextTemplated .0
CodegenCS是T4模板的替代品,非常容易学习(全部基于C#和字符串插值),并提供非常可维护的脚本(没有废话缩进)。