首页 > 其他分享 >将 Source Generator 生成的源代码保存到本地文件

将 Source Generator 生成的源代码保存到本地文件

时间:2024-09-12 08:52:39浏览次数:10  
标签:git Generator 代码 生成器 生成 Source 文件夹 源代码

默认的源代码生成器所生成的代码都是没有直接存放到项目文件夹里面的,不受源代码管理工具管理,对使用方的开发者来说很难直接阅读或查找到 Source Generator 生成的源代码。本文将和大家介绍如何使用 EmitCompilerGeneratedFiles 属性配置将生成的代码保存到本地文件

将 Source Generator 生成的源代码保存到本地,只需设置 EmitCompilerGeneratedFiles 属性,在 csproj 项目文件里面进行设置,代码如下

  <PropertyGroup>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  </PropertyGroup>

完成此配置之后,将会自动将源代码生成器所生成的代码存放到本地文件夹里面。默认的生成源代码将会存放到 $(IntermediateOutputPath)\generated 文件夹里面,这里的 $(IntermediateOutputPath)obj\$(Configuration)\$(TargetFramework.ToLowerInvariant())\ 构成,调试下的输出大概是 obj\Debug\net8.0\ 等类似的文件夹里

接着将会拼接上源代码生成器分析器项目的程序集名与具体的源代码生成类型,最后加上源代码生成器 AddSource 时设置的 hintName 作为文件名。如对于本文例子里面,在名为 YaijowhelawFerhecarnal 的分析器项目里面的名为 YaijowhelawFerhecarnal.CodeCollectionIncrementalGenerator 的生成器类型使用如下代码所生成的名为 GeneratedSourceTest 的代码,将会存放到 obj\Debug\net8.0\generated\YaijowhelawFerhecarnal\YaijowhelawFerhecarnal.CodeCollectionIncrementalGenerator\GeneratedSourceTest.cs 文件夹里面

namespace YaijowhelawFerhecarnal
{
    [Generator(LanguageNames.CSharp)]
    public class CodeCollectionIncrementalGenerator : IIncrementalGenerator
    {
        public void Initialize(IncrementalGeneratorInitializationContext context)
        {
            string source = @"
using System;

namespace YawrofajuGekeyaljilay
{
    public static partial class Program
    {
        public static void HelloFrom(string name)
        {
            Console.WriteLine($""Says: Hi from '{name}'"");
        }
    }
}
";

            context.RegisterPostInitializationOutput(initializationContext =>
            {
                initializationContext.AddSource("GeneratedSourceTest", source);
            });
        }
    }
}

如果期望自己指定保存的文件夹,可以自行设置 EmitCompilerGeneratedFiles 属性,如以下代码

  <PropertyGroup>
    <CompilerGeneratedFilesOutputPath>Generated\$(TargetFramework)</CompilerGeneratedFilesOutputPath>
  </PropertyGroup>

以上代码之所以拼接上 TargetFramework 是因为期望默认处理多框架的文件冲突问题,源代码生成器会在多框架下分别执行,为每个框架生成独立的代码。如果在多框架项目下没有配置加上 TargetFramework 将会造成生成的源代码存放的文件冲突

上面代码添加之后,预计将会导致构建不通过,一般的保存信息如下

error CS0111: 类型“Program”已定义了一个名为“HelloFrom”的具有相同参数类型的成员

这是因为设置放在 Generated\$(TargetFramework) 会被 csproj 默认作为源代码引用,导致原本源代码生成器生成的代码已经在内存里面被引用一次,现在源代码生成器输出的文件又被再次引用,导致了最终构建不通过

解决方法就是去掉对 CompilerGeneratedFilesOutputPath 的文件的引用,确保只有引用源代码生成器在内存的一份代码,如以下代码

  <ItemGroup>
    <!-- 添加了内存里面的文件,不应该添加磁盘的,否则添加两份 -->
    <Compile Remove="$(CompilerGeneratedFilesOutputPath)/**/*.cs" />
  </ItemGroup>

通过以上的方式即可让源代码生成器所生成的文件输出到本地文件里面,方便将生成的代码签进源代码版本控制里面,如 git 等里面,也方便进行静态代码阅读和代码审查

更多关于源代码生成博客请参阅我的 博客导航

本文以上代码放在githubgitee 欢迎访问

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

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 522923c0de0d436f6f5a44dffd0b99a325bc5a64

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

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 522923c0de0d436f6f5a44dffd0b99a325bc5a64

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

标签:git,Generator,代码,生成器,生成,Source,文件夹,源代码
From: https://www.cnblogs.com/lindexi/p/18011557

相关文章

  • 为什么推荐用成品源代码来做二次开发?
    提到源码,作为互联网从业者肯定都知道,很多时候,众多互联网公司核心的竞争力就是自身的源码,这套源码经过公司多名程序员工程师不断迭代开发,不断完善开发,已经发挥着越来越重要的作用。推荐购买成品源代码用于二次开发,主要基于以下几个理由:1.节约成本与时间快速启动项目:成品源代码通......
  • @Autowired和@Resource的区别
    1--@Autowired@Autowired是Spring里面提供的一个注解,它默认是根据类型来实现Bean的依赖注入;@Autowired里面有一个required属性,默认值是true表示强制要求bean实例的一个注入,在应用启动的时候,如果IOC容器中不存在对应类型的bean,那么启动就会报错;如果我们不希望实现依赖注入就可以......
  • “Resource Forest” 模型通过将用户帐户和资源分开到不同的AD森林中,增强了安全性、管
    在ActiveDirectory(AD)域环境中,“ResourceForest”模型是一种架构设计用于优化和管理大型、复杂的网络环境。这种模型主要用于处理企业中不同的组织单位和资源的需求,确保安全性、灵活性和管理的简便性。ResourceForestModel的定义和特点定义:ResourceForest 模型是在AD......
  • HtmlWebpackPlugin插件和HtmlWebpackInlineSourcePlugin插件的使用
    一、HtmlWebpackPlugin1.作用自动创建HTML自动创建HTML:在构建过程中自动生成一个HTML5文件,该文件可以包含所有webpack打包过程中生成的bundles。这意味着你不需要手动创建HTML文件,插件会为你处理这一切。自动注入资源:自动将打包生成的JavaScript、CSS等文件注入到生成的HTML文......
  • jeecg 3.7.0连接达梦8数据库报错 Failed to configure a DataSource: 'url' attribute
    参考之前的博文设置过连接达梦数据库 根据提示,应该是jdbc驱动不兼容导致。博主使用的达梦数据库是20240715版本,需要使用8.1.3.149版本的jdbc驱动才能连接。在jeecg中更新jdbc驱动,下面以maven为例1.在maven的配置文件settings.xml中的<mirrors>标签内增加mvnrepository仓库地......
  • 数码管钟(可复制源代码)
    效果演示源代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>数码管钟</title&......
  • 会滑行的小球(可复制源代码)
    效果演示源代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>会滑行的小球</titl......
  • 太极(可复制源代码)
    效果演示HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>太极</title&g......
  • 源代码加密是什么?如何做源代码加密?
    源代码加密是什么?如何做源代码加密?在软件开发过程中,版本管理工具如SVN和GIT是不可或缺的组成部分,它们帮助团队管理源代码的变更和版本。然而,这些工具也面临着源代码泄露的安全风险。如果不针对数据进行加密保护,很容易出现“一锅端”的现象。所以源代码开发环境复杂,涉及的开发......
  • 初识:DynamicDatasource动态数据源
    目录主要作用具体例子其他Maven模块如何利用动态数据源模块就根据用户服务、订单服务、商品服务、DynamicDataSource服务,DynamicDataSource服务的application.yaml的配置信息,实现实现主从、读写分离、负载均衡、高可用性和故障切换主要作用支持多数据源切换:在微服务架......