如何阻止Visual Studio/Rider包管理器修改指定.csproj的<PackageReference>元素
问题描述
我有部分仅用于模拟器调试场景的NuGet包引用,配置代码如下:
<PackageReference Include="Foo.Bar" Version="1.2.4" Condition=" '$(IsForSimulator)' == 'false' "> <PackageReference Include="Foo.Bar" Version="1.2.3-force-dud" Condition=" '$(IsForSimulator)' == 'true' "> <NoWarn>$(NoWarn);NU1605</NoWarn> </PackageReference>
当我通过NuGet包管理器GUI将包更新至1.2.5版本时,两个<PackageReference>元素都会被修改!我希望第二个元素不受影响,请问是否可行?
解决方案
可行,你可以通过以下两种方式实现:
给调试专用引用添加
PrivateAssets="All"属性
在模拟器专用的PackageReference中添加该属性后,NuGet包管理器GUI会将其识别为仅用于本地构建的内部引用,不会在更新操作中修改它。修改后的配置如下:<PackageReference Include="Foo.Bar" Version="1.2.3-force-dud" Condition=" '$(IsForSimulator)' == 'true' "> <NoWarn>$(NoWarn);NU1605</NoWarn> <PrivateAssets>All</PrivateAssets> </PackageReference>注意:后续通过GUI查看包列表时,这个调试专用引用可能会被标记为“已过时”,直接忽略即可,这正是我们想要的效果。
用自定义MSBuild目标控制更新范围
若不想添加PrivateAssets,可以在项目文件中添加自定义目标,明确指定仅更新非模拟器场景的包引用:<Target Name="UpdateNonSimulatorPackages"> <PackageUpdate Include="Foo.Bar" Version="1.2.5" Condition=" '$(IsForSimulator)' == 'false' " /> </Target>后续更新时通过MSBuild命令执行该目标,替代GUI操作,就能避免误改调试专用的引用。
内容的提问来源于stack exchange,提问作者XDS
相关产品推荐
相关产品推荐

