本文将和大家介绍一个 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. 记录--前端实现电子签名(web、移动端)通用

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在现在的时代发展中,从以前的手写签名,逐渐衍生出了电子签名.电子签名和纸质手写签名一样具有法律效应.电子签名目前主要还是在需要个人确 ...

  2. 记录--Uniapp + TypeScript 配置文档

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 0 目标 使用 uniapp  + TypeScript 为基础栈进行小程序开发 uniapp 是一个使用 Vue.js 开发所有前端应用 ...

  3. power quyer 批量合并同一文件夹下数据格式相同的Excel文件

    一.需求描述:现在有一批数据格式相同的Excel文件需要把里面的内容合并到同一个Excel的一个sheet里面 二.新建一个叫数据汇总的Excel文件-数据-新建查询-从文件-选择数据存放的文件夹-然 ...

  4. 在命令行中使用 cl.exe编译 C/C++ 程序并执行

    cl.exe是Microsoft C/C++编译器. 我的VC6.0安装目录为:D:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev9 ...

  5. 软件发布版本号命名风格(GUN)

    GUN风格: (1)产品初版时,版本号可以为0.1或0.1.0,也可以为1.0或1.0.0: (2)当产品进行了局部修改或bug修正时,主版本号和子版本号都不变,修正版本号+1: (3)当产品在原有的 ...

  6. 【已解决】解决Python打开文件---路径报错问题(SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape)

    原因分析: 在windows系统当中读取文件路径可以使用\,但是在python字符串中\有转义的含义, 如\t可代表TAB,\n代表换行, 所以我们需要采取一些方式使得\不被解读为转义字符.目前有3个 ...

  7. #搜索#AT2368 [AGC013B] Hamiltonish Path

    题目 求一条简单路径使得路径端点不能再被延伸 分析 一开始想到可能和度数有关,其实没必要, 随便以一个点作为路径中的点深搜两次即可 代码 #include <cstdio> #includ ...

  8. #莫队,bitset#洛谷 3674 小清新人渣的本愿

    题目 分析 只要做到\(O(n\sqrt{n})\)的时间复杂度就可以了 考虑莫队,首先乘号就是枚举\(x\)的约数\(d\), 判断\(d\)和\(\frac{x}{d}\)是否同时出现, 再考虑差 ...

  9. OpenHarmony轻量系统中内核资源主要管理方式

    一.背景 OpenAtom OpenHarmony(以下简称"OpenHarmony")轻量系统面向MCU类处理器例如ARM Cortex-M.RISC-V 32位的设备,硬件资源 ...

  10. Mysql之innodb架构

    Innodb存储引擎的架构 内存结构 Bufer Pool 缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载 ...