前面我們簡單的實現了一個從swagger生成實體類的Generator,在實際使用中,通過nuget包引用使用會更方便,那麼本篇文章將介紹如何將Generator打包成Nuget來使用。
打包Nuget
這裏我們將GenerateClassFromSwagger.Analysis打包成Nuget進行使用。
首先需要修改項目文件。
修改項目文件
在PropertyGroup添加
以及添加ItemGroup 包含
如果沒有第三方依賴的時候,僅這些配置已經足夠了。如果需要依賴第三方組件。
這裏我們依賴了Newtonsoft.Json的包,則需要添加
完整修改後的項目配置如下:
<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
完整配置如下:
<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標籤。
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
然後再次編譯。可以在obj目錄中找到生成的文件列表。
如果需要輸出到指定目錄,則跟上篇文章的方式一致,這裏就不贅述了。
結語
本片文章介紹了將Generator打包成Nuget進行使用,可以更方便的在不同項目中使用。
本文代碼倉庫地址https://github.com/fanslead/Learn-SourceGenerator