您对问题的评论听起来像是您的目标是在单个项目中保持包版本在不同条件下保持一致,但您希望在解决方案或存储库中的项目之间保持一致也是一种常见情况。
我将建议一个不同的解决方案。在您的 repo 根目录中创建一个 Directory.Build.props,如下所示:
<Project>
<PropertyGroup>
<NewtonsoftJsonVersion>12.0.1</NewtonsoftJsonVersion>
<xunitVersion>2.4.1</xunitVersion>
</PropertyGroup>
</Project>
现在在需要 Newtonsoft.json 的项目中,将 PackageReference 更改为 <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />。
如果你把你的生产代码放在src\,测试代码放在test\,那么你可以创建一个test\Directory.Build.props,内容如下:
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
<PropertyGroup>
<PackageReference Include="xunit" Version="$(xunitVersion)" />
</PropertyGroup>
</Project>
现在你test\下的所有项目都会自动获取xunit,并且保证是同一个版本。
当你想升级一个包版本时,你可以使用包管理器 UI 来检查版本,但遗憾的是不能升级版本。为此,您需要手动编辑 repo root Directory.Build.props(因此将其添加到您的解决方案中以便快速访问),但您可以确信对该包的每个引用都将使用相同的版本。仅限于使用PackageReference的项目,packages.config目前没有解决方案,但MSBuild条件也仅适用于PackageReference。
您可以在 Microsoft 存储库中经常看到这种模式。当然,NuGet(我的团队,是的!),以及各种 .NET 存储库(如 cli 和 sdk)都可以做到这一点,尽管是在手动导入的 props 文件中,而不是 Directory.Build.props,尽管概念是相同的。