如何阻止JetBrains Rider移除项目依赖的Private配置项?
问题:Rider升级NuGet包时丢失Private=False属性
我有一个包含依赖项的C#项目,已在.csproj文件中将依赖项的Private属性设置为False,避免把包复制到构建目录。但使用JetBrains Rider的NuGet包管理器升级包时,Private元素会被移除,请问有没有办法阻止该行为?
示例(将Apache.NMS从2.0.0升级到2.1.0)
升级前的.csproj引用:
<Reference Include="Apache.NMS, Version=2.0.0.0, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL"> <HintPath>..\packages\Apache.NMS.2.0.0\lib\net40\Apache.NMS.dll</HintPath> <Private>False</Private> </Reference>
升级后的.csproj引用(Private元素被移除):
<Reference Include="Apache.NMS, Version=2.1.0.0, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL"> <HintPath>..\packages\Apache.NMS.2.1.0\lib\net40\Apache.NMS.dll</HintPath> </Reference>
解决方案
改用PackageReference格式(推荐)
如果你的项目还在使用旧的packages.config,建议切换到PackageReference。这种格式支持直接在包引用中配置PrivateAssets属性,升级时NuGet(包括Rider的管理器)会保留这个设置:<PackageReference Include="Apache.NMS" Version="2.1.0"> <PrivateAssets>none</PrivateAssets> </PackageReference>PrivateAssets=none的效果和原来的Private=False完全一致,不会在升级时被删除。全局统一配置Private属性(适用于packages.config)
如果你不想切换格式,可以在.csproj中通过全局ItemGroup来锁定特定包的Private属性,避免单个引用被覆盖:<ItemGroup> <Reference Include="Apache.NMS, Version=2.1.0.0, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL"> <HintPath>..\packages\Apache.NMS.2.1.0\lib\net40\Apache.NMS.dll</HintPath> <Private>False</Private> </Reference> </ItemGroup>也可以用条件匹配批量设置:
<ItemGroup> <Reference Condition="'@(Reference->Metadata('Include'))' == 'Apache.NMS'"> <Private>False</Private> </Reference> </ItemGroup>调整Rider的NuGet设置
打开Rider的设置界面(File > Settings > Build, Execution, Deployment > NuGet),检查是否有“保留现有引用属性”相关的选项。部分版本的Rider支持在升级包时保留自定义的引用属性,开启这个选项就能防止Private元素被移除。
内容的提问来源于stack exchange,提问作者reyymo
相关产品推荐
相关产品推荐

