Visual Studio 2019无项目引用时未下载全部NuGet包问题咨询
问题根本原因
MSBuild 默认的 NuGet 还原逻辑仅会扫描启动项目(即你的应用A)的完整依赖链范围内的所有项目依赖包。当你移除A对B的项目引用后,B不再属于A的依赖链,即便你设置了构建依赖项要求B先编译,NuGet 还原阶段默认不会主动扫描解决方案中所有未被启动项目引用的项目的依赖,因此B依赖的NuGet包C不会被自动下载。
可行规避方案
- 方案1:开启解决方案全局NuGet全项目扫描
在解决方案根目录的NuGet.Config文件中添加如下配置即可生效,开启后NuGet还原阶段会自动扫描所有纳入构建范围的项目,无论是否被启动项目引用,都会还原对应依赖包:<configuration> <packageRestore> <add key="restoreProjectAssetsForAllProjects" value="true" /> </packageRestore> </configuration> - 方案2:给A添加仅构建不引用的项目依赖配置
无需修改全局配置,直接编辑A的.csproj文件,添加如下项目引用规则,既可以保证B的完整构建流程(含依赖还原)触发,又不会让B的类型开放给A的开发者引用,完全避免误调用的问题,同时还会自动把B的输出和依赖包复制到A的输出目录,适配Prism动态加载模块的场景:
核心配置<ItemGroup> <ProjectReference Include="..\你的B项目路径\B.csproj" ReferenceOutputAssembly="false" OutputItemType="Content" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>ReferenceOutputAssembly="false"的作用就是告知MSBuild不需要将B的程序集添加到A的编译引用列表,仅触发B的构建流程。 - 方案3:给B单独添加预构建自动还原规则
如果你不想修改A或者全局配置,直接编辑B的.csproj文件,添加预构建目标,每次构建B之前自动执行本项目的NuGet还原即可:
若你使用NuGet CLI而非dotnet CLI,将命令替换为<Target Name="ForceRestoreBBeforeBuild" BeforeTargets="BeforeBuild"> <Exec Command="dotnet restore "$(MSBuildProjectFullPath)"" /> </Target>nuget restore "$(MSBuildProjectFullPath)"即可,需确保NuGet CLI已加入系统环境变量。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

