本文将和大家介绍一个 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端Charles抓包

    目录介绍 01.下载安装 02.抓包代理设置 03.抓包Https操作 04.抓包原理介绍 05.抓包数据介绍 06.常见问题总结 07.Android拦截抓包 01.下载安装 下载地址(下载对应的平 ...

  2. 记录--前端加载超大图片(100M以上)实现秒开解决方案

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前端加载超大图片时,一般可以采取以下措施实现加速: 图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间.压缩图片时需要 ...

  3. c# WPF制作百度网盘资源搜索工具

    界面如下 1.搜索中 2.搜索成功 源码地址:https://github.com/BruceQiu1996/BaiduDiskSearcher 希望有用的学到的或者对此感兴趣的可以给一个star,谢 ...

  4. CSP:Object as Point同会议论文,相似思想用于人脸和行人检测 | CVPR 2019

    CSP将目标定义为中心点和尺寸,通过网络直接预测目标的中心和寸尺,相对于传统的RCNN类型检测算法轻量化了不少.整体思想与Object as Points撞车了,真是英雄所见略同   来源:晓飞的算法 ...

  5. KingbaseES V8R6集群运维案例之---sys_rewind应用分析

    ​ 案例说明: sys_rewind是用于在数据库cluster的时间线分叉以后,同步一个 KingbaseES 数据库cluster 和同一数据库cluster另一份拷贝的工具.一种典型的场景是在失 ...

  6. UE427-C++实现摄像机视角的移动,类似开镜效果

    教程 方法 调整相机视野和弹簧臂的长度 //自带的tick函数内 需要使用DeltaTime if (bZoomIn) { ZoomFactor += DeltaTime / 0.5f; } else ...

  7. io_utils/time_utils

    io_utils.h #pragma once #include<stdio.h> #include<stdarg.h> void PrintBinary(unsigned i ...

  8. #斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums

    题目 已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示 分析 显然得到两条性质: \(f_{i+1}=f_{i-1}+f_i\) \(2f_i=f_{i+1}+f_{i-2}\) 那么 ...

  9. Python 数组和列表:创建、访问、添加和删除数组元素

    Python 没有内置支持数组,但可以使用 Python 列表来代替. 数组 本页将向您展示如何使用列表作为数组,但要在 Python 中使用数组,您需要导入一个库,比如 NumPy 库.数组用于在一 ...

  10. Visual Studio 2022插件的安装及使用 - 编程手把手系列文章

    这次开始写手把手编程系列文章,刚写到C#的Dll程序集类库的博文,就发现需要先介绍Visual Studio 2022的插件的安装及使用,因为在后面编码的时候会用到这些个插件,所以有必要先对这个内容进 ...