本文将和大家介绍一个 IIncrementalGenerator 增量 Source Generator 生成代码技术的应用例子,将当前的构建时间写入到代码里面。这个功能可以比较方便实现某些功能的开关,比如说设置某个功能自动在具体应用发布之后过一段时间就失效等功能

在不使用 IIncrementalGenerator 增量 Source Generator 生成代码技术时,也可以方便的实现在代码里面了解应用的构建时间,请看 Roslyn MSBuild 在构建完成之后 将构建时间写入到输出文件

本文将介绍的方法可以完全通过预编译方式,将构建时间写固定到代码里面,参与构建。对比以上博客最大的不同在于不需要引入额外的本地文件

本文使用的代码大量从 C# Source Generators: How to get build information? 博客里面拷贝,感谢 Steven Giesel 大佬提供的方法

根据 IIncrementalGenerator 增量 Source Generator 生成代码技术 的入门博客,咱将创建两个项目,一个用来测试源代码生成效果,一个用来制作核心的源代码生成。本文将跳过入门级的项目初始化介绍,如对分析器项目的创建有疑惑,还请参阅入门博客了解更多内容

我将在本文末尾放入所使用的代码的下载方式,预计代码拉下来是可以非常方便运行和调试

在源代码生成项目里面,也就是分析器项目里面新建一个用来辅助放入构建信息的类型,比如本文使用 FooGenerator 作为生成器类型的命名,定义如下

    [Generator(LanguageNames.CSharp)]
public class FooGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
}
}

先订阅项目的配置,根据项目的 Options 配置即可生成包含构建信息的代码

    [Generator(LanguageNames.CSharp)]
public class FooGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var compilerOptions = context.CompilationProvider.Select((s, _) => s.Options);
}
}

完成订阅之后即可设置源代码生成的输出,如以下代码,生成了一个名为 BuildInformation 的静态类,且此静态类还没有包含在任何的命名空间里面

            context.RegisterSourceOutput(compilerOptions, static (productionContext, options) =>
{
var code = $@"
using System;
using System.Globalization; public static class BuildInformation
{{
/// <summary>
/// Returns the build date (UTC).
/// </summary>
public static readonly DateTime BuildAt = DateTime.ParseExact(""{DateTime.UtcNow:O}"", ""O"", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
/// <summary>
/// Returns the platform.
/// </summary>
public const string Platform = ""{options.Platform}"";
/// <summary>
/// Returns the configuration.
/// </summary>
public const string Configuration = ""{options.OptimizationLevel}"";
}}
"; productionContext.AddSource("LinkDotNet.BuildInformation.g", code);
});

如此即可生成一个包含构建时间以及构建时使用的平台,以及构建配置是 Debug 还是 Release 的源代码

使用源代码生成器生成的代码的项目即可直接使用 BuildInformation 类型获取到对应的构建信息,如以下代码例子

Console.WriteLine($"BuildAt={BuildInformation.BuildAt}");
Console.WriteLine($"Platform={BuildInformation.Platform}");
Console.WriteLine($"Configuration={BuildInformation.Configuration}");

运行的输出内容大概如下

BuildAt=2023/11/9 13:41:29
Platform=AnyCpu
Configuration=Release

如此即可很方便通过源代码生成技术将构建信息写入到代码里面,让业务方根据写入的构建信息决定具体的行为

如果大家对这个将构建写入到代码的功能特别感兴趣,但自己不想再去创建分析器,可以使用大佬编写好的 NuGet 库。使用非常方便,只需要安装 LinkDotNet.BuildInformation 即可,安装完成之后即可在自己的项目里面使用 BuildInformation 类型获取构建信息

安装 LinkDotNet.BuildInformation 库既可以通过 NuGet 管理器安装,也可以编辑 csproj 项目文件添加以下代码进行安装

<PackageReference Include="LinkDotNet.BuildInformation" Version="0.4.2" />

本文代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 2e02c5f1bdfeb3e53578e6ff63aa560f3ce5a51a

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 2e02c5f1bdfeb3e53578e6ff63aa560f3ce5a51a

获取代码之后,进入 QewelechairWhegalnarlaywhe 文件夹

IIncrementalGenerator 增量 Source Generator 生成代码应用 将构建时间写入源代码的更多相关文章

  1. mybatis Generator生成代码及使用方式

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5889312.html 为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,OR ...

  2. mybatis之generator生成代码

    首先在pom文件中引入以下代码 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId&g ...

  3. 用org.mybatis.generator 生成代码

    1:引入pom 2:增加生成配置xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  4. 2016.7.12 eclispe使用mybatis generator生成代码时提示project E is not exist

    运行mybatis-generator之后,出现错误:project E is not exist   错误原因:使用了项目的绝对路径. http://bbs.csdn.net/topics/3914 ...

  5. mybatis Generator生成代码及使用方式(转载)

    转载自:http://www.cnblogs.com/fengzheng/p/5889312.html 文章很棒,很不错,转了.

  6. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...

  7. IDEA使用mybatis generator自动生成代码

    主要就三步: 1.pom 文件中引入jar包并配置 build 属性 <dependencies> <!-- 自动生产mapper Begin! --> <depende ...

  8. springboot 使用mybatis-generator自动生成代码

    这里只介绍mybatis generator生成代码 一.pom配置 在build-->plugins-->添加plugin <plugin> <groupId>o ...

  9. 安卓自动生成代码插件-Android code Generator(转)

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 介绍 A ...

  10. mybatis generator maven插件自动生成代码

    如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...

随机推荐

  1. flutter3-dylive仿抖音App实例|Flutter3+Getx实战短视频直播应用

    原创研发flutter3+getX+mediaKit跨平台仿抖音app短视频直播实战Flutter3-DouYin. flutter3_dylive使用最新跨平台技术flutter3.x+dart3+ ...

  2. css实现按钮点击水波纹效果和两边扩散效果

    废话少说,先上代码了,复制到html中即可使用 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> & ...

  3. Android为按钮Button添加事件

    匿名内部类 1 <!--匿名内部类方式--> 2 <Button 3 android:id="@+id/btn2" 4 android:layout_width= ...

  4. #容斥#51nod 1407 与与与与

    题目 给出 \(n\) 个数,问有多少个子集的按位与为0 分析 考虑容斥,设 \(f[i]\) 表示有多少个数按位与为 \(x\),满足 \(x\&i=i\) 那么答案就是 \(\sum_{i ...

  5. #容斥,搜索,线性筛#CF83D Numbers

    洛谷 CF83D 分析 题意就是\(\sum_{i=l}^r[k|i]*[mn[\frac{i}{k}]\geq k]\) 首先线性筛每个数的最小质因数,如果\(\frac{r}{k}\)较小直接暴力 ...

  6. 可视化库 pygal 生成png中文乱码

    解决方法:设置style,style中设置中文字体 代码如下: import pygal from pygal.style import Style import cairosvg style = S ...

  7. idea无法解析目录@/xxx

    显示错误如下 解决办法 vite.config.js 中添加配置,配置'@'的别名 import { fileURLToPath, URL } from 'node:url' // https://v ...

  8. 【开发者说】XstoryMaker快速书写剧本场景动画

    原文:https://mp.weixin.qq.com/s/63V0dfD2IufbX92JeD-G_A,点击链接查看更多技术内容. [开发者说]栏目是为HarmonyOS开发者提供的展示和分享平台, ...

  9. Groovy反序列化链分析

    前言 Groovy 是一种基于 JVM 的开发语言,具有类似于 Python,Ruby,Perl 和 Smalltalk 的功能.Groovy 既可以用作 Java 平台的编程语言,也可以用作脚本语言 ...

  10. 行业软件开发商怎样来抢 BI 这块蛋糕?

    随着企业信息化建设的深入,很多机构的生产系统已建设完成,在保证生产的有序进行后,如何更有效地进行经营决策成了管理者面临的最大任务.商业智能(BI)就是在这种背景成为支撑企业经营分析的一大利器. 根据 ...