如何通过Package.props修改.csproj中PackageReference的Include属性值
实现方案
仅修改Package.props即可全局替换所有子项目的对应Nuget包为本地项目引用,无需改动任何子项目的.csproj文件,配置如下:
<Project> <!-- 原有Package.props的其他统一版本配置不需要修改,新增以下内容即可 --> <!-- 本地引用切换开关,需要使用本地版本时设为true,发布时改回false即可自动恢复Nuget引用 --> <PropertyGroup> <UseLocalCoolPackage>true</UseLocalCoolPackage> </PropertyGroup> <Target Name="ReplaceCoolPackageWithLocal" BeforeTargets="CollectPackageReferences" Condition="'$(UseLocalCoolPackage)' == 'true'"> <ItemGroup> <!-- 移除所有子项目中声明的My.Cool.Package Nuget引用 --> <PackageReference Remove="My.Cool.Package" /> <!-- 新增本地项目引用,路径请调整为相对于子项目.csproj的正确相对路径 --> <ProjectReference Include="../../My.Cool.Package.csproj" /> </ItemGroup> </Target> </Project>
实现说明
- 这段配置通过MSBuild目标在Nuget包收集阶段前执行,确保可以移除所有子项目声明的对应Nuget引用,不会受
Package.props导入顺序影响 - 切换开关可以让你在本地开发和正式发布场景下一键切换引用源,不需要批量修改项目文件
- 如果需要替换多个Nuget包,只需要在Target的ItemGroup内新增多组
PackageReference Remove和对应的ProjectReference节点即可
路径优化建议
如果你的解决方案内子项目层级不同,相对路径容易出错,可以用MSBuild内置的解决方案根路径属性拼接绝对路径,示例:
<ProjectReference Include="$(SolutionRoot)/src/My.Cool.Package/My.Cool.Package.csproj" />
内容的提问来源于stack exchange,提问作者Grigoryants Artem
相关产品推荐
相关产品推荐

