我构建了一个增量源生成器并将其打包到 nuget 包中以供不同的解决方案使用。我在我的“模型”项目中引用了它。问题是模型项目被我的解决方案中的许多其他项目引用。由于某种原因,源生成器正在引用我的模型项目的每个项目上运行,即使它们没有使用我的源生成器引用 nuget 包。我想知道为什么会这样,以及如何阻止它发生。
我找到了非常简单的答案。将
PrivateAssets="all"
添加到您的包裹参考中。就我而言,它看起来像:
<PackageReference Include="MapGenerator.Generator" Version="0.3.5-beta" PrivateAssets="all"/>
我看到几个地方说,如果您将源生成器打包为 nuget 包,则无需考虑任何其他因素。不过,在我看来,这是一个相当大的问题。
总之,如果您希望源生成器仅在引用它的项目上运行,则必须添加 PrivateAssets 属性。
这个问题还有另一种解决方案,你可以将 DevelopmentDependency 添加到你的 csproj 中,如下所示:
<PropertyGroup>
...
<!-- Mark the package as a development-only dependency -->
<DevelopmentDependency>true</DevelopmentDependency>
</PropertyGroup>
通过标记源生成器
developmentDependency=true
,它只会在直接引用它的项目中运行,并且不会传播到引用这些项目的下游项目。这可以避免源生成器在意外的项目中执行。