首页 > 其他分享 >学习Source Generators之打包成Nuget使用

学习Source Generators之打包成Nuget使用

时间:2024-04-11 12:11:07浏览次数:20  
标签:文件 编译 项目 Nuget Source Generators true 打包

前面我们简单的实现了一个从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.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文件。
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>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项目,编译完成后。可以在分析器看到我们生成的文件
image.png
image.png
跟我们直接引用项目依赖的效果一致。

输出文件

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

<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>

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

结语

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

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

标签:文件,编译,项目,Nuget,Source,Generators,true,打包
From: https://www.cnblogs.com/fanshaoO/p/18128770

相关文章

  • try-with-resource的使用
    try-with-resources支持从Java7开始的所有后续版本。只有实现了AutoCloseable或Closeable接口的资源才能用于try-with-resources。可以在括号内声明多个资源,用分号分隔。如果try块中抛出了异常,并且close()方法也抛出了异常,那么抛出的异常将是try块中的异常......
  • source 和export 命令的区别
    1、sourcesource的解释,内置的shell命令,其功能是什么?什么是shell?source指令的作用:1、刷新当前shell环境2、在当前环境使用source执行Shell脚本3、从脚本中导入一个shell功能函数4、从另一个Shell脚本中读取变量一、概述source命令是一个内置的shell命令,用于从当前shel......
  • docker踩坑之 device or resource busy
    问题描述linux服务器上运行了一个docker容器,在运行cp命令时报错dockercpredis.confmyadmin_redis:/data/redis.conf将服务器上的文件拷贝到docker容器内部时,报以下错误Errorresponsefromdaemon:Errorprocessingtarfile(exitstatus1):unlinkat/data/redi......
  • asp.core生成docker镜像(使用本地nuget)
    生成Dockerfilevs自带生成Dockerfile功能了使用本地的nuget包加入nuget配置文件NuGet.ConfigNuGet.Config配置文件,配置地址如果没有配置生成镜像会报错,没找到package生成镜像生成Docker映像(想深入了解,可以网上看看dockerbuild的参数)dockerbuild-f"C:\Projec......
  • 搭建一个私有NuGet服务器 BaGet
    搭建一个私有NuGet服务器日常在公司内部,不同项目往往会创建一些公共类库,很多公司考虑安全问题,不会直接上传至NuGet,这时候就需要建立公司内部私有的NuGet服务器。一.项目简介BaGet是一个开源轻量级的NuGet服务器项目,基于.NetCore开发的,支持跨平台部署,可以快速部署和使用,适用于......
  • 通过命名方式推送nubkg文件到公司nuget服务器
    1.管理后台获取apikeys:https://www.nuget.org/users/account/LogOn2.查询版本号包版本号查询地址:http://package-version.xxxx.com/,发布已有存在的nubkg文件,需查询之前的版本号,避免重复。3.在要上传dll的项目中生成nuget包文件3.1配置生成nuget信息在需要生成包文件的类库......
  • WPF instantiate class instance as resource
    //xaml<Windowx:Class="WpfApp42.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • class path resource [applicationContext.xml] cannot be opened because it does no
    测试运行报错:无法打开applicationContext.xml解决方法:打开File->ProjectStructure...找到Moudles->path->OutPutPath中写入resources路径......
  • CancellationTokenSource Cancel IsCancellationRequested
    //xaml<Windowx:Class="WpfApp37.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • Rancher-rke: E0404 14:22:44.616099 5841 memcache.go:287] couldn‘t get resource
    一、根因    1、非正常关闭了主机。    2、导致docker上的metrics容器进程挂掉。二、解决办法    1、重启docker        systemctlrestartdocker    2、清理处于Exited状态的pod        dockerrm`dockerps-a|......