.NET 8中如何恢复同一NuGet包的多个版本用于测试?
解决.NET 8 CPM下获取同一SDK多版本的问题
核心方案:用PackageDownload替代重复PackageReference
NuGet的PackageDownload项专门用来下载指定版本的包到本地缓存,不会将其添加为项目引用,完美适配你“仅下载、通过反射加载”的需求,且不会触发重复引用的错误。
在测试项目的csproj中添加如下配置:
<ItemGroup> <!-- 明确指定需要下载的每个SDK版本 --> <PackageDownload Include="Foo.Bar.Sdk" Version="[1.0.0]" /> <PackageDownload Include="Foo.Bar.Sdk" Version="[2.0.0]" /> </ItemGroup>
执行dotnet restore后,这两个版本的SDK都会被下载到本地NuGet缓存目录(默认路径:%userprofile%\.nuget\packages或~/.nuget/packages)。
进阶:自动复制SDK到输出目录(方便反射加载)
如果希望把不同版本的SDK程序集复制到测试项目的输出目录,便于后续反射加载,可以添加自定义MSBuild目标:
<ItemGroup> <!-- 也可以用版本范围批量指定,比如[1.0.0, 3.0.0)会下载1.x和2.x的所有版本 --> <PackageDownload Include="Foo.Bar.Sdk" Version="[1.0.0, 2.0.1]" /> </ItemGroup> <Target Name="CopySdkVersionsToOutput" AfterTargets="Restore"> <!-- 匹配缓存中所有版本的Foo.Bar.Sdk.dll --> <ItemGroup> <SdkAssemblies Include="$(NuGetPackageRoot)foo.bar.sdk\*\lib\net8.0\Foo.Bar.Sdk.dll" /> </ItemGroup> <!-- 复制到输出目录的SdkVersions子文件夹,按版本号分类存放 --> <Copy SourceFiles="@(SdkAssemblies)" DestinationFolder="$(OutputPath)SdkVersions\%(SdkAssemblies.RecursiveDir)" SkipUnchangedFiles="true" /> </Target>
执行dotnet build后,你会在输出目录的SdkVersions文件夹下看到按版本号分目录存放的SDK程序集,直接用Assembly.LoadFrom加载即可。
为什么原来的方案行不通?
CPM的VersionOverride是用来覆盖中心包版本的,但NuGet默认会合并重复的PackageReference项——哪怕添加了ExcludeAssets="all",最终也只会保留最高版本的引用。而PackageDownload不受这个合并规则限制,允许明确指定多个版本进行下载。
内容的提问来源于stack exchange,提问作者Edwin Young
相关产品推荐
相关产品推荐

