ToB企服应用市场:ToB评测及商务社交产业平台

标题: 分析器/源生成器添加项目依赖的方式 [打印本页]

作者: 美食家大橙子    时间: 2024-4-10 20:30
标题: 分析器/源生成器添加项目依赖的方式
  1. title: 分析器/源生成器添加项目依赖的方式
  2. date: 2024-01-19
  3. categories: 编程
  4. tags:
  5. - C#
  6. - .NET
  7. - Roslyn
复制代码
前言

写分析器(源生成器)时经常需要引用别的包,但直接引用是无法运行的。
下面我们分不同情况来讨论在分析器项目如何对依赖进行引用。
下图中“包引用”指PackageReference,“项目引用”指ProjectReference。
其中项目引用是通过dll文件传递的,包引用是通过nupkg文件传递的,
最大的区别是项目引用默认不可以传递,而包引用默认可以传递。
flowchart TD    A1--项目引用-->A2    GA--包引用-->A3    GB1--包引用-->B2    GB2--包引用-->B3    C1--项目引用-->C2    subgraph G1[单NuGet包项目]        subgraph GA[NuGet包]            direction TB            A1[分析器项目]            A2[NuGet包主项目]        end        A3[用户项目]    end    subgraph G2[NuGet包传递]        subgraph GB1[分析器NuGet包]            B1[分析器项目]        end        subgraph GB2[NuGet包]            B2[NuGet包项目]        end        B3[用户项目]    end    subgraph G3[直接项目引用]        C1[分析器项目]        C2[用户项目]    end引用方法

虽然有三种及更多项目组织方式,但解决思路是相同的,原理是将需要引用的dll路径告诉分析器即可。
如何写

在csproj项目文件中用以下语句[1]即可实现这个功能(以System.Text.Json为例):
  1. <ItemGroup>
  2.     <PackageReference Include="System.Text.Json" Version="8.0.1" GeneratePathProperty="true" PrivateAssets="all" ReferenceOutputAssembly="false" />
  3. </ItemGroup>
  4. <PropertyGroup>
  5.     <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
  6. </PropertyGroup>
  7. <Target Name="GetDependencyTargetPaths">
  8.     <ItemGroup>
  9.         <TargetPathWithTargetPlatformMoniker Include="$(PkgSystem_Text_Json)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
  10.     </ItemGroup>
  11. </Target>
复制代码
第一部分ItemGroup是引用包项目。其中:
第二部分PropertyGroup是指定需要GetDependencyTargetPaths这个Target。
第三部分Target指定了GetDependencyTargetPaths具体如何实现,即将告诉编译器指定dll的路径。
写在哪

一个解决方案有很多项目,那上面的问题应该写在哪呢?有一个很容易的判断标准:
写在用户项目引用的对象上。
举例来说,例如“直接项目引用”中,用户项目引用的是分析器项目的dll,所以我们应该将上面那些写在分析器的csproj中。
“NuGet包传递”比较特殊,NuGet包项目引用了分析器项目的nupkg后传递给了用户项目,本质上引用的是分析器项目(因为用户项目也可以直接引用分析器项目NuGet包),所以我们应该写在分析器的csproj中。
“单NuGet包项目”中,NuGet包主项目会将分析器项目的dll包含进输出的nupkg中,所以我们应该写在NuGet包主项目的csproj中。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4