
WebSharper F#源码生成器新特性编译前自动生成代码与输出自动合并【免费下载链接】coreWebSharper - Full-stack, functional, reactive web apps and microservices in F# and C#项目地址: https://gitcode.com/gh_mirrors/core113/coreWebSharper F# 源码生成器是 WebSharper 10 新增的元编程特性它在 F# 编译启动之前自动运行你的代码生成逻辑把生成的.fs源文件加入编译再配合changeTracking输出自动合并机制你手动修改过的 JavaScript 输出在重新编译时也能被安全合并而不是被覆盖。两大特性组合起来让“手写 自动生成”的混合工作流真正可用。为什么需要“编译前”源码生成传统做法里代码生成往往发生在编译之后或依赖 MSBuild 自定义任务时机晚、集成复杂。WebSharper 的 F# 源码生成器F# source generators直接把生成步骤嵌入编译管线时机早在 F# 编译器FCS开始编译前完成源文件生成生成的代码享受完整的类型检查与重构支持按扩展名路由项目中的非标准源文件如自定义.abc、.ws等扩展名会被自动交给对应生成器处理⚡可增量生成器能拿到上一次的输出文件列表PreviousOutputFiles从而只在新文件出现时生成实现增量构建该特性在 WebSharper 10.0.0 中随版本 10.0.0.651 发布发布说明见 10.0.0.md。一键启用如何注册一个 F# 源码生成器使用方式非常轻量只需实现WebSharper.ISourceGenerator接口并在程序集级别用WebSharper.FSharpSourceGenerator特性声明“扩展名 → 生成器类型”的映射。官方测试项目里的示例可以照抄特性声明[assembly: WebSharper.FSharpSourceGenerator(ext, typeofExtGenerator)]生成器实现Generate input根据输入路径生成输出文件返回生成的文件数组完整示例仅 19 行位于 FSharpSourceGeneratorTest.fs其中还演示了通过input.Print把生成日志输出到编译日志中方便排查问题。编译器侧的发现与加载逻辑在 Compile.fs 中实现它会扫描项目引用的程序集找到声明了对应扩展名的FSharpSourceGeneratorAttribute通过反射实例化生成器并校验其实现了 Interfaces.fs 中定义的ISourceGenerator接口。增量生成PreviousOutputFiles 让重复构建更快生成器输入GenerateInput中的PreviousOutputFiles字段是关键增量信号首次构建该字段为None生成器执行完整生成如把源文件复制/转换为新扩展名文件后续构建字段携带上次生成的文件列表生成器直接返回None跳过重复工作在上面的示例中这一模式让重复构建几乎零开销。生成文件的跟踪信息记录在 MSBuild props 文件中包含DependentUpon关联关系由编译器读取后还原“上次输出”详见 Compile.fs 中对 props 文件的解析逻辑。输出自动合并手写修改不再被覆盖这是最容易让新手“踩坑”的场景WebSharper 会把你的 F#/C# 代码编译为 JavaScript bundle。如果你为了调试或打补丁直接改了输出的.js文件下次构建就会被覆盖。WebSharper 10 新增changeTracking设置 输出合并output merging解决方式很直观✅ 开启 changeTracking 后编译器会追踪输出文件的历史版本✅ 重新构建时如果你的手动修改能自动合并进新输出就保留修改合并冲突时才提示✅ 底层文件操作采用“备份 → 执行 → 失败回滚”的可撤销事务模式任何一步失败都会自动还原保证输出目录不会被写坏这套安全合并逻辑实现在 Merging.fs 中其中的UnrollableIOActions事务执行器确保目录替换、备份清理等操作原子化完成。上手路径与延伸阅读步骤说明参考位置1️⃣ 定义生成器实现ISourceGenerator处理GenerateFSharpSourceGeneratorTest.fs2️⃣ 注册映射程序集级FSharpSourceGenerator特性同上3️⃣ 理解管线编译器如何发现并调用生成器Compile.fs4️⃣ 保护手写输出启用 changeTracking 输出合并Merging.fs一句话总结F# 源码生成器把“代码生成”提前到了编译前输出合并则保护了你的手工修改——两者都是 WebSharper 10 元编程体系的实用组件建议配合发布说明 10.0.0.md 中 #1476 与 #1513 两条特性说明一起阅读。【免费下载链接】coreWebSharper - Full-stack, functional, reactive web apps and microservices in F# and C#项目地址: https://gitcode.com/gh_mirrors/core113/core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考