本文将和大家介绍一个 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. Android网络收集和ping封装库

    目录介绍 01.基础介绍 02.stetho大概流程 03.Android中应用 04.如何使用 05.案例截图如下 06.网络请求接口信息 07.如何使用ping 01.基础介绍 该工具作用 诸葛书 ...

  2. 记录--P0事故预警

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 某一天,前端小余同学和后端别问我小哥在做登录业务接口对接,出于业务的特殊性和安全性的考虑,她和后端小哥约定"user&qu ...

  3. vscode中Vetur插件关闭组件自动导入路径

    vscode配置项中加入 "vetur.completion.autoImport": false, 或者,将图中4处勾去掉即可

  4. Java事件侦听器学习记录

    前言 我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事件. 事件驱动机制是观察者模式(称发布订阅)具体实现,事件对象(Event ...

  5. DevSecOps 中的漏洞管理(下)

    建立漏洞管理程序以支持DevSecOps 在讨论DevSecOps及DevOps模型中包含安全性的重要性时,建立有效的漏洞管理实践是非常重要的.这可以通过将漏洞管理设置为程序来实现. 我们可以开始对I ...

  6. 2023 LGR 非专业级别软件能力认证第一轮(初赛)S组

    计算器.背包.代码都不能带进考场 禁赛三年并全国通报 B选项符合while语句 弱类型编程语言指的是可以进行类型转换,可以参与各种类型变量的运算 \[3\times 60(秒)\times 44.1\ ...

  7. 【我与openGauss的故事】如何管理数据库安全(第一部分)

    前言 2021 年 6 月 10 日国家颁布数据安全法对我们国家来说具有重大意义 信息安全法 梳理几点重要意义: (一) 对数据的有效监管实现了有法可依,填补了数据安全保护立法的空白,完善了网络空间安 ...

  8. 脑洞golang embed 的使用场景

    golang 的 embed 的功能真是一个很神奇的功能,它能把静态资源,直接在编译的时候,打包到最终的二进制程序中. 为什么会设计这么一个功能呢?我想和 golang 的崇尚简单的原则有关系吧.它希 ...

  9. Pytorch DistributedDataParallel(DDP)教程二:快速入门实践篇

    一.简要回顾DDP 在上一篇文章中,简单介绍了Pytorch分布式训练的一些基础原理和基本概念.简要回顾如下: 1,DDP采用Ring-All-Reduce架构,其核心思想为:所有的GPU设备安排在一 ...

  10. Redis为什么是单线程还支持高并发

    Redis为什么设计成单线程模式因为redis是基于内存的读写操作,所以CPU不是性能瓶颈,而单线程更好实现,所以就设计成单线程模式 单线程模式省却了CPU上下文切换带来的开销问题,也不用去考虑各种锁 ...