• 学习Source Generators之打包成Nuget使用


    前面我们简单的实现了一个从swagger生成实体类的Generator,在实际使用中,通过nuget包引用使用会更方便,那么本篇文章将介绍如何将Generator打包成Nuget来使用。

    打包Nuget#

    这里我们将GenerateClassFromSwagger.Analysis打包成Nuget进行使用。
    首先需要修改项目文件。

    修改项目文件#

    在PropertyGroup添加true表示在编译时生成nuget包以及false表示不要将生成器作为库依赖项包括在内。
    以及添加ItemGroup 包含将生成器打包到nuget包的分析器目录中
    如果没有第三方依赖的时候,仅这些配置已经足够了。如果需要依赖第三方组件。
    这里我们依赖了Newtonsoft.Json的包,则需要添加 来指定和Generator的依赖关系。
    完整修改后的项目配置如下:

    <Project Sdk="Microsoft.NET.Sdk">
    
    	<PropertyGroup>
    		<TargetFramework>netstandard2.0TargetFramework>
    		<LangVersion>latestLangVersion>
    		<Version>1.0.2Version>
    		<EnforceExtendedAnalyzerRules>trueEnforceExtendedAnalyzerRules>
    		<AllowUnsafeBlocks>trueAllowUnsafeBlocks>
    		<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPathsGetTargetPathDependsOn>
    		<GeneratePackageOnBuild>trueGeneratePackageOnBuild>
    		<IncludeBuildOutput>falseIncludeBuildOutput>
    	PropertyGroup>
    
    	<ItemGroup>
    		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" PrivateAssets="all" GeneratePathProperty="true" />
    		<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.2.0" PrivateAssets="all" />
    		<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
    	ItemGroup>
    
    	<Target Name="GetDependencyTargetPaths" AfterTargets="ResolvePackageDependenciesForBuild">
    		<ItemGroup>
    			<TargetPathWithTargetPlatformMoniker Include="@(ResolvedCompileFileDefinitions)" IncludeRuntimeDependency="false" />
    		ItemGroup>
    	Target>
    
    	<ItemGroup>
    		
    		<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    
    		
    		<None Include="$(PkgNewtonsoft_Json)\lib\netstandard2.0\*.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    	ItemGroup>
    Project>
    
    

    编译项目#

    修改项目文件后,编译项目,可以在Debug目录下看到nupkg文件。
    image.png
    将文件上传到nuget.org,等待上架成功后可以在NUGET包管理器搜索并安装。

    安装Nuget#

    首先创建一个GenerateClassFromSwaggerNuget的控制台项目,然后添加Nuget依赖。搜索GenerateClassFromSwagger.Analysis即可找到。
    image.png
    将我们的swagger.json复制一份过来并设置成AdditionalFiles。
    image.png
    修改包属性的OutputItemType和ReferenceOutputAssembly
    完整配置如下:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>ExeOutputType>
        <TargetFramework>net8.0TargetFramework>
        <ImplicitUsings>enableImplicitUsings>
        <Nullable>enableNullable>
      PropertyGroup>
    
      <ItemGroup>
        <AdditionalFiles Include="Files\swagger.json" />
      ItemGroup>
    
      <ItemGroup>
        <PackageReference Include="GenerateClassFromSwagger.Analysis" Version="1.0.2" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
      ItemGroup>
    
    Project>
    
    

    编译控制台项目#

    接下来编译GenerateClassFromSwaggerNuget项目,编译完成后。可以在分析器看到我们生成的文件
    image.png
    image.png
    跟我们直接引用项目依赖的效果一致。

    输出文件#

    同样,如果我们需要输出文件,在项目文件中添加EmitCompilerGeneratedFiles标签。

    <EmitCompilerGeneratedFiles>trueEmitCompilerGeneratedFiles>
    

    然后再次编译。可以在obj目录中找到生成的文件列表。
    image.png
    如果需要输出到指定目录,则跟上篇文章的方式一致,这里就不赘述了。

    结语#

    本片文章介绍了将Generator打包成Nuget进行使用,可以更方便的在不同项目中使用。

    本文代码仓库地址https://github.com/fanslead/Learn-SourceGenerator

  • 相关阅读:
    VS Code,插件REST CLient,post请求不能正常返回的原因
    Mysql: 创建表 和 管理表
    Shell脚本-字符串
    Shell-06循环结构
    图08 --- 网络的最大流
    分布式面试详解
    Springboot+Axios双token解决token过期续签问题
    SpringSecurity用户授权
    Python大数据之PySpark(四)SparkBase&Core
    分布式组件 nacos使用
  • 原文地址:https://www.cnblogs.com/fanshaoO/p/18128770