VS2008/2010旧项目NuGet配置升级至VS2017规范咨询
升级VS2008/2010项目NuGet配置到VS2017标准的安全指南
VS2017采用了自动包还原的原生支持,不再依赖旧的.nuget文件夹和手动导入的nuget.targets,下面是分步升级方案:
一、全局清理:移除解决方案级的.nuget文件夹
直接删除解决方案根目录下的.nuget子文件夹(包含NuGet.Config、NuGet.exe、NuGet.targets三个文件)——VS2017会通过IDE或MSBuild自动处理包还原,不需要这些旧文件。
二、逐个项目清理.csproj中的旧配置
针对你提到的三个旧项目,分别做如下调整:
1. 处理Proj1和Proj2
- 移除所有指向
$(SolutionDir)\.nuget\NuGet.targets的<Import>节点(包括带Condition的版本) - 保留与
Microsoft.Bcl.Build相关的Import(如果项目确实依赖这个包):<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" /> - 更新
EnsureNuGetPackageBuildImports目标,移除对.nuget\NuGet.targets的错误检查,只保留必要的包导入检查:<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" /> </Target>
2. 处理Proj3
Proj3本身没有导入旧的nuget.targets,只需确认:
- 保留
Microsoft.Bcl.Build的Import节点(若依赖该包) - 确保
EnsureNuGetPackageBuildImports目标仅检查该包的导入文件(和上面Proj1调整后的目标一致即可)
三、VS2017标准NuGet配置样式
VS2017新项目的NuGet配置核心特点是:
- 无解决方案级
.nuget文件夹 - 仅导入项目依赖的NuGet包自身提供的
.props或.targets文件(按需) EnsureNuGetPackageBuildImports目标仅检查这些必要的导入文件,确保包还原完成后才能构建
以你的VS2017 Web应用项目为参考,标准配置示例(如果项目依赖Microsoft.Bcl.Build):
<!-- 仅导入实际依赖的包目标文件 --> <Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" /> <!-- 确保包已还原的检查目标 --> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" /> <!-- 若有其他依赖包的导入文件,在此添加对应的Error检查节点 --> </Target>
四、验证升级效果
- 保存所有修改后,用VS2017打开解决方案
- 右键解决方案 → 还原NuGet包(或等待IDE自动还原)
- 尝试构建所有项目,确认没有构建错误
- 若项目仍依赖
Microsoft.Bcl.Build,可以考虑更新到最新兼容版本(如果项目允许),进一步对齐现代NuGet规范
内容的提问来源于stack exchange,提问作者Kjell Rilbe
相关产品推荐
相关产品推荐

