如何在F#项目中配置Mono T4模板实现代码生成?
在F# .NET Framework 4.8项目中配置Mono.TextTemplating自动代码生成
可行性
完全可行——通过修改.fsproj文件,就能让MSBuild在构建时自动执行T4模板转换,实现和C#项目一样的自动代码生成效果。
具体操作步骤
1. 修正TT文件的项目项定义
原项目里把Template.tt标记为<None>,这不会触发转换。改成TextTemplatingFile并指定输出路径:
<ItemGroup> <TextTemplatingFile Include="Template.tt"> <Generator>MonoTextTemplatingFileGenerator</Generator> <OutputFile>Generated/Template.g.fs</OutputFile> <!-- 建议把生成文件放在单独的Generated目录,避免混乱 --> <LastGenOutput>Template.g.fs</LastGenOutput> </TextTemplatingFile> <Compile Include="**.fs" /> <!-- 把生成的文件加入编译列表,确保它被编译 --> <Compile Include="Generated/Template.g.fs" /> </ItemGroup>
2. 导入Mono.TextTemplating的MSBuild目标
在项目文件的最后(</Project>标签之前)添加这段代码,导入Mono提供的构建任务,让MSBuild知道要执行T4转换:
<Import Project="$(NuGetPackageRoot)mono.texttemplating\2.3.1\build\Mono.TextTemplating.targets" />
注意:如果之后升级了Mono.TextTemplating的版本,记得把路径里的
2.3.1换成对应的新版本号。
3. 可选:自定义转换行为
如果需要调整模板转换的细节(比如是否生成预处理模板、输出编码),可以在<PropertyGroup>里加这些配置:
<PropertyGroup> <!-- 原有的属性保留 --> <TargetFramework>net4.8</TargetFramework> <GenerateDocumentationFile>true</GenerateDocumentationFile> <!-- T4相关配置 --> <TextTemplatingPreprocess>false</TextTemplatingPreprocess> <!-- false直接生成可编译代码,true生成预处理模板 --> <TextTemplatingOutputEncoding>utf-8</TextTemplatingOutputEncoding> </PropertyGroup>
4. 验证配置
保存修改后的.fsproj,在Visual Studio里点生成解决方案,检查Generated目录下是否出现了Template.g.fs,而且这个文件已经被包含到项目的编译项里了。
完整的修改后项目文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net4.8</TargetFramework> <GenerateDocumentationFile>true</GenerateDocumentationFile> <!-- T4配置 --> <TextTemplatingPreprocess>false</TextTemplatingPreprocess> <TextTemplatingOutputEncoding>utf-8</TextTemplatingOutputEncoding> </PropertyGroup> <ItemGroup> <TextTemplatingFile Include="Template.tt"> <Generator>MonoTextTemplatingFileGenerator</Generator> <OutputFile>Generated/Template.g.fs</OutputFile> <LastGenOutput>Template.g.fs</LastGenOutput> </TextTemplatingFile> <Compile Include="**.fs" /> <Compile Include="Generated/Template.g.fs" /> </ItemGroup> <ItemGroup> <PackageReference Include="Mono.TextTemplating" Version="2.3.1" /> </ItemGroup> <ItemGroup> <PackageReference Update="FSharp.Core" Version="7.0.200" /> </ItemGroup> <Import Project="$(NuGetPackageRoot)mono.texttemplating\2.3.1\build\Mono.TextTemplating.targets" /> </Project>
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

