You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:56:34