使用 nuget restore 命令还原项目的 NuGet 包的时候,NuGet 会尝试自动检测计算机上已经安装的 MSBuild。不过,如果你同时安装了 Visual Studio 2017 和 Visual Studio 2019,那么 NuGet 有可能找到错误版本的 MSBuild。

本文介绍如何解决自动查找版本错误的问题。


本文内容

  • 问题
  • 使用命令行参数解决
  • 修改环境变量解决

问题

当我们敲下 nuget restore 命令的时候,命令行的第 2 行会输出自动检测到的 MSBuild 版本号,就像下面的输出一样:

NuGet Version: 5.0.2.5988
MSBuild auto-detection: using msbuild version ‘15.9.21.664’ from ‘C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin’. Use option -MSBuildVersion to force nuget to use a specific version of MSBuild.

实际上我计算机上同时安装了 Visual Studio 2017 和 Visual Studio 2019,我有两个不同版本的 MSBuild:

  • 15.9.21.664

    • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin
  • 16.1.76.45076
    • C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin

要让 NuGet 找到正确版本的 MSBuild.exe,我们有三种方法。

使用命令行参数解决

实际上前面 nuget restore 命令的输出中就已经可以看出来其中一个解决方法了,即使用 -MSBuildVersion 来指定 MSBuild 的版本号。

虽然命令行输出中推荐使用了 -MSBuildVersion 选项来指定 MSBuild 的版本,但是实际上实现同样功能的有两个不同的选项:

  • -MSBuildPath 自 NuGet 4.0 开始新增的选项,指定 MSBuild 程序的路径。
  • -MSBuildVersion

当同时指定上面两个选项时,-MSBuildPath 选项优先级高于 -MSBuildVersion 选项。

于是我们的 nuget restore 命令改成这样写:

> nuget restore -MSBuildPath "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin"

输出现在会使用期望的 MSBuild 了:

Using Msbuild from 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin'.

修改环境变量解决

NuGet 的命令行自动查找 MSBuild.exe 时,是通过环境变量中的 PATH 变量来找的。会找到 PATH 中第一个包含 msbuild.exe 文件的路径,将其作为自动查找到的 MSBuild 的路径。

所以,我们的解决方法是,如果找错了,我们就把期望正确的 MSBuild 所在的路径设置到不期望的 MSBuild 路径的前面。就像下图这样,我们把 2019 版本的 MSBuild 设置到了 2017 版本的前面。

以下是 NuGet 项目中自动查找 MSBuild.exe 文件的方法,源代码来自 https://github.com/NuGet/NuGet.Client/blob/2b45154b8568d6cbf1469f414938f0e3e88e3704/src/NuGet.Clients/NuGet.CommandLine/MsBuildUtility.cs#L986。

private static string GetMSBuild()
{var exeNames = new [] { "msbuild.exe" };if (RuntimeEnvironmentHelper.IsMono){exeNames = new[] { "msbuild", "xbuild" };}// Try to find msbuild or xbuild in $Path.var pathDirs = Environment.GetEnvironmentVariable("PATH")?.Split(new[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);if (pathDirs?.Length > 0){foreach (var exeName in exeNames){var exePath = pathDirs.Select(dir => Path.Combine(dir, exeName)).FirstOrDefault(File.Exists);if (exePath != null){return exePath;}}}return null;
}

我故意在桌面上放了一个老旧的 MSBuild.exe,然后将此路径设置到环境变量 PATH 的前面,出现了编译错误。


参考资料

  • NuGet CLI restore command - Microsoft Docs
  • How Can I Tell NuGet What MSBuild Executable to Use? - Stack Overflow
  • VS2017 MSBuild autodetection takes MSBuild/v14 instead of v15 for WPF project - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

为 NuGet 指定检测的 MSBuild 路径或版本,解决 MSBuild auto-detection: using msbuild version 自动查找路径不合适的问题相关推荐

  1. Windows 7 安装最新版 2021-3-1 的 tableau 时提示 “指定程序要求更新的 Windows 版本” 解决办法

    Tableau 安装时出现上面的情况时,解决办法: 1.Tableau 官网找到历史版本 Tableau Desktophttps://www.tableau.com/zh-cn/support/re ...

  2. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  3. 我的世界手机版java安装失败_我的世界中国版JAVA路径错误的解决方法分享

    我的世界中国版JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?九游必须 ...

  4. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  5. bat 指定hid驱动加载_Visual Paradigm:在数据库连接中为JDBC驱动程序使用参考路径...

    Visual Paradigm支持连接到各种数据库服务器以执行数据库工程,包括数据库与实体关系图(ERD)之间的正向和反向工程. 在此过程中,用户将需要通过JDBC连接将Visual Paradigm ...

  6. Nuget 管理报repositories.config 访问路径被拒绝 解决办法

    Nuget 管理报repositories.config 访问路径被拒绝 解决办法 就是把packages/repositories.config 删除 再管理更新 即可 生成最新的repositor ...

  7. dotween路径移动_Unity---DOTween插件学习(3)---获取数据、协程、路径动画

    [Toc] 本文及系列参考于Andy老师的DOTween系列 欢迎大家关注**Andy老师** 10.获取数据 类方法 返回所有暂停的动画,没有则返回null var list = DOTween.P ...

  8. 【R-CNN论文翻译】目标检测经典论文R-CNN最新版本(v5版)全面中文翻译

    R-CNN目标检测的奠基性文章,学习目标检测必看的经典论文之一,后续有Fast R-CNN,Faster R-CNN一系列论文. 目前网上能找到的论文翻译版本要么不全,要么不是最新版本的(论文从201 ...

  9. Django模板、配置文件、静态文件及案例实现(创建模板、设置模板查找路径、模板接收视图传入的数据、模板处理数据、BASE_DIR、DEBUG、本地语言与时区、App应用配置)

    1.Django模板 网站如何向客户端返回一个漂亮的页面呢? 漂亮的页面需要html.css.js. 可以把这一堆字段串全都写到视图中, 作为HttpResponse()的参数,响应给客户端. 存在的 ...

最新文章

  1. 老板来了:人脸识别 + 手机推送,老板来了你立刻知道!
  2. GitHub上拥有4万+star的大佬大厂求职经验分享
  3. 天天用Synchronized,底层原理是个啥?
  4. 原生态HTML文件上传与下载
  5. 三天100元从零开始搭建Hadoop集群
  6. CSS3 帧动画分段,CSS3 animation实现逐帧动画效果
  7. linux 显示文件多少行
  8. Linux内存映射私有对象,Linux访问内存映射的对象
  9. OpenStack 云计算基础知识
  10. Spring mvc 转发
  11. 备课好帮手,免费分享 下载
  12. pygame详细安装教程
  13. python哪个字体好看_Python实现对比不同字体中的同一字符的显示效果
  14. 运营必备九大互联网思维
  15. 人力资源面试必问的十大问题
  16. 京东有多少钱可以重来?
  17. kali 去windows共享数据--smbclient使用方法_原水_新浪博客
  18. 文献解读 | 科学家发现代谢调控促进肿瘤转移新机制
  19. differential privacy 学习笔记(一)
  20. Linux Nginx安装配置及HTTPS配置

热门文章

  1. 【问题解决】Tensorflow运行出现错误: No module named tensorflow.contrib
  2. 02_ue4进阶末日生存游戏开发[准备工程]
  3. 手机探索者开发实录--源代码
  4. 「征集写作意见」活动进行中
  5. 嘴上的“用户思维”,心中的“流量思维”
  6. IRB5400机器人保养手册
  7. 池建强:从锤子到极客邦科技,我的职业生涯巡礼丨今晚直播!
  8. 交叉编译 arm libssh2 和libcurl(变态方法)
  9. compressor 图片压缩上传
  10. 在Linux下Jmeter的分布式配置