学习Source Generators之打包成Nuget使用

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

打包Nuget

这里我们将GenerateClassFromSwagger.Analysis打包成Nuget进行使用。

首先需要修改项目文件。

修改项目文件

在PropertyGroup添加 true 表示在编译时生成nuget包以及 false 表示不要将生成器作为库依赖项包括在内。

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

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<TargetFramework>netstandard2.0</TargetFramework>
		<LangVersion>latest</LangVersion>
		<Version>1.0.2</Version>
		<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
		<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
		<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
		<GeneratePackageOnBuild>true</GeneratePackageOnBuild><!-- Generates a package at build -->
		<IncludeBuildOutput>false</IncludeBuildOutput><!-- Do not include the generator as a lib dependency -->
	</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>
		<!-- Package the generator in the analyzer directory of the nuget package -->
		<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />

		<!-- Package the Newtonsoft.Json dependency alongside the generator assembly -->
		<None Include="$(PkgNewtonsoft_Json)\lib\netstandard2.0\*.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
	</ItemGroup>
</Project>

编译项目

修改项目文件后,编译项目,可以在Debug目录下看到nupkg文件。

将文件上传到nuget.org,等待上架成功后可以在NUGET包管理器搜索并安装。

安装Nuget

首先创建一个GenerateClassFromSwaggerNuget的控制台项目,然后添加Nuget依赖。搜索GenerateClassFromSwagger.Analysis即可找到。

将我们的swagger.json复制一份过来并设置成AdditionalFiles。

修改包属性的OutputItemType和ReferenceOutputAssembly

完整配置如下:

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <AdditionalFiles Include="Files\swagger.json" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="GenerateClassFromSwagger.Analysis" Version="1.0.2" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
  </ItemGroup>

</Project>

编译控制台项目

接下来编译GenerateClassFromSwaggerNuget项目,编译完成后。可以在分析器看到我们生成的文件

跟我们直接引用项目依赖的效果一致。

输出文件

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

xml 复制代码
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>

然后再次编译。可以在obj目录中找到生成的文件列表。

如果需要输出到指定目录,则跟上篇文章的方式一致,这里就不赘述了。

结语

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

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

相关推荐
唐青枫12 小时前
别只会看日志:C#.NET SOS 调试扩展从 Dump 到内存泄漏排查
c#·.net
yswenli19 小时前
基于C#开发网站视频嗅探下载工具——BrowserVideoGrabber
c#·videodownload·webvideodownload·videograbber
Lost of 程序猿20 小时前
M2 实战:询价与采购订单聚合落地——跨聚合一致性、领域事件与 Outbox
开发语言·c#·asp.net·.net
Polevne1 天前
C# GRPC 一元与双向流
linux·算法·c#
XiaoZhenHua982 天前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng6612 天前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d
淡海水2 天前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
XiaoZhenHua982 天前
C# WinForms + 西门子S7 + SQLite + EPPlus生产数据采集系统架构设计
系统架构·sqlite·c#
Lost of 程序猿2 天前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net
cjp5603 天前
012.UG二次开发,UG管道服务器与WPF管道通讯,传输JSON数据
c#