如何隐藏VS解决方案资源管理器中的NuGet嵌入文件并自动配置ExcludeAssets
增量源生成器NuGet包自动配置ExcludeAssets的可行方案
问题背景
我开发了首个增量源生成器NuGet包,最初将其嵌入analyzer/cs NuGet子目录作为分析器时运行正常。为了让消费者能编辑随包提供的.cs文件以定制生成代码,我修改了包项目的.csproj,添加以下配置嵌入目标.cs文件并打包build目录下的props文件:
<ItemGroup> <None Include="Custom_Warnings\SettableNTimesProperty.cs"> <Pack>true</Pack> <PackagePath>Copied_Files\Custom_Warnings</PackagePath> <PackageCopyToOutput>false</PackageCopyToOutput> </None> <None Include="build\*.props"> <Pack>true</Pack> <PackagePath>build\$(TargetFramework)\</PackagePath> <PackageCopyToOutput>false</PackageCopyToOutput> </None> </ItemGroup>
修改后出现副作用:消费项目的解决方案资源管理器中会显示props文件和readme文件,而之前仅作为分析器时不会显示。手动在消费项目的.csproj中添加以下配置可解决该问题:
<ItemGroup> <PackageReference Include="SettableOnceProperty" Version="0.1.1"> <ExcludeAssets>Compile</ExcludeAssets> </PackageReference> </ItemGroup>
现需确认是否可通过包内的props文件自动为所有消费项目添加<ExcludeAssets>Compile</ExcludeAssets>配置。
可行方案
完全可以通过包内的props文件实现自动配置,步骤如下:
- 在NuGet包项目的
build目录下(对应打包后的build\$(TargetFramework)路径),创建或编辑与包名同名的props文件(例如SettableOnceProperty.props)。 - 在该props文件中添加以下内容,通过
Update属性修改当前包的PackageReference元数据:
<ItemGroup> <PackageReference Update="$(NuGetPackageId)" Include="$(PackageVersion)"> <ExcludeAssets>Compile</ExcludeAssets> </PackageReference> </ItemGroup>
使用$(NuGetPackageId)和$(PackageVersion)可确保配置与当前包的信息自动对齐,无需硬编码版本号。
3. 重新打包并发布NuGet包,消费者安装后,该props文件会被NuGet自动导入项目,无需手动修改配置即可隐藏不必要的文件。
原理说明
NuGet会自动识别包内build目录下的props/targets文件,并在消费项目构建阶段自动导入。通过PackageReference的Update属性,可修改已存在的引用元数据,从而自动为所有消费者添加ExcludeAssets配置,避免手动操作。
内容的提问来源于stack exchange,提问作者TRex
相关产品推荐
相关产品推荐

