Visual Studio 在构建、重建和清理解决方案时使用啥 dotnet core cli 命令(或 msbuild 命令)?
Posted
技术标签:
【中文标题】Visual Studio 在构建、重建和清理解决方案时使用啥 dotnet core cli 命令(或 msbuild 命令)?【英文标题】:What dotnet core cli command(or msbuild commands) does Visual Studio use when Building, Rebuilding and Cleaning the Solution?Visual Studio 在构建、重建和清理解决方案时使用什么 dotnet core cli 命令(或 msbuild 命令)? 【发布时间】:2019-11-05 18:08:30 【问题描述】:我想知道在我的 dotnet 核心应用程序中构建/重建和清理解决方案时 Visual Studio 使用的确切 dotnet cli 命令?
我知道 dotnet 核心 cli 是在 msbuild 之上构建的,因此当您运行 Build/Rebuild 或 Clean Solution Visual Studio 时使用 msbuild 直接命令而不是来自 dotnet core cli 的命令?
对吗?
如果这是正确的,我想知道它在三个操作中使用了哪个或多个 msbuild 命令:
-
构建解决方案
重建解决方案
清洁解决方案
哪些 dotnet core cli 命令与此等价?
我从这篇文章中知道(Relationship between the dotnet cli and the new vs2017 msbuild) 以下命令在 dotnet 和 msbuild 中执行构建、重建和清理。
Dotnet cli:
构建:dotnet 构建 重建:dotnet build --no-incremental 清理:dotnet cleanMsbuild:
构建:msbuild /t:build 重建:msbuild /t:rebuild 清理:msbuild /t:clean我猜这还不是全部?这很好,但我想看看 Visual Studio 为这些操作生成了什么?
我想知道是否可以更改 Visual Studio 的行为,使其运行 dotnet cli 命令而不是 msbuid?
研究:
我在Visual Studio(Visual Studio 2017 Enterprise Version 15.9.11)中构建了一个asp.net core web api项目
我在构建/重建和清理解决方案时正在查看 Visual Studio 输出,但找不到与 dotnet 核心 cli 或 msbuild。然后我去了VisualStudio工具/选项/“项目和解决方案”/“构建和运行”并更改了选项:
MSBuild 项目构建输出详细程度:尝试了“详细”和“诊断”选项 MSBuild 项目构建日志文件详细程度:尝试了“详细”和“诊断”选项结果是Visual Studio的Output窗口产生的日志很大,很难找到 将用于操作的确切命令。我可以看到输出中的许多地方都使用了 msbuild,但这有点令人困惑 找到确切的命令。
我也看到了这个问题 (Does Visual Studio use MSBuild internally, and what is the exact command?)
这个答案说:
引用:
“似乎没有指定MSBuild命令行选项, 而是在 Visual Studio 中调用 MSBuild API。除非 你有 Visual Studio 源代码进行逆向工程,你不能 获取等效的命令行。”
dotnet core cli msbuild 也一样吗?
感谢您对此提供任何帮助或澄清。
【问题讨论】:
嗨朋友,这个问题有什么更新吗?如果您发现任何发现,请随时在此处分享:)我稍后会删除此评论,因为它只是一个提醒。 不幸的是没有,但似乎无法找到VS使用的确切命令,正如您在答案中已经提到的那样。 【参考方案1】:我知道 dotnet 核心 cli 是在 msbuild 之上构建的,所以当 你运行 Build/Rebuild 或 Clean 解决方案 Visual Studio 使用 msbuild 直接命令而不是来自 dotnet core cli 的命令?
对于VS2017,我认为VS IDE在Clean, Build and Rebuild
时直接调用msbuild.exe。您可以通过任务管理器或Process Monitor轻松检查这一点。
至于你上面提到的:It appears that the MSBuild command line options are not specified, but rather the MSBuild APIs are called within Visual Studio.
我认为这是正确的,但仅适用于早期版本与版本(2010、2013)。我用VS2010测试过,在VS中做与构建相关的动作时,它不会调用MSBuild.exe。所以VS2010中的msbuild不会作为separate process
执行。
但是对于 VS2017,当我创建以 .net 内核为目标的项目时,在执行与构建相关的操作(单击构建、清理、重建按钮)时,它显然会调用 msbuild.exe,如下所示:
关于 VS 实际执行的 msbuild 命令:
从现在开始 VS2017 调用 msbuild.exe 来构建 .net core 或 .net fx 项目。
在我看来:
对于只包含项目的解决方案:
构建解决方案=> msbuild xxx.sln /t:build /p:Configuration=xxx;Platform=xxx
重建解决方案=>msbuild xxx.sln /t:rebuild /p:Configuration=xxx;Platform=xxx
=>msbuild xxx.sln /t:clean;build /p:Configuration=xxx;Platform=xxx
清理解决方案=>msbuild xxx.sln /t:clean /p:Configuration=xxx;Platform=xxx
=>msbuild xxx.sln /t:clean
我认为每次在VS中点击Build按钮时,它都会从这个框中选择Configuration和Platform的值,因为这两个参数肯定会传递给MSBuild.exe。
另外,我们可以发现的一件事是,IDE 在开始构建之前有一个检查过程:它会检查文件是否过期,然后确定是否需要构建。但这不是您在问题中要求的内容,它不会影响您想要的命令,所以我跳过它。
此外,请参阅此页面,我们可以在此处找到一些与 msbuild 相关的设置:
所以实际上我认为上面的命令应该添加一些参数,例如:msbuild ... -m:8 -v:M
。
另外:虽然我发现VS中与建筑相关的动作会直接调用msbuild.exe。我不确定我上面的命令是否 100% 正确。除了在 VS IDE 中开发菜单命令的人,恐怕没有人能保证。所以如果我有什么误解,请随时纠正我:)
如果你只是想获得与 VS 中完全相同的东西,你也可以试试devenv.exe。这是官方文档中的the only place,它确认构建开关与集成开发环境(IDE)中的Build Solution menu command
具有相同的功能。
【讨论】:
感谢您的回答。它回答了我的部分问题,但不是全部。根据我的研究,我还得出结论,没有办法找到 Visual Studio 生成的确切命令。我对您的答案投了赞成票,因为它为某些问题提供了答案和说明。 :) 还是让我们拭目以待,也许有人知道或有其他想法或观点。 @xargs-mkdir 很高兴知道它在某些方面有所帮助。也许答案是否定的,因为 VS 现在无法显示 VS 生成的确切构建命令。查看this document可以发现,Build、Rebuild、Clean按钮是嵌入在IDE中的一个菜单命令,每次点击按钮=>按钮点击事件中的核心代码都会为我们做构建动作。但是代码如何调用msbuild.exe并传递参数是未知且不可见的。 似乎无法从 VS 中找到确切的 msbuild 命令。如果有人找到一种方法,我会很高兴看到它:)。您的回答帮助我理解了其他一些观点,所以谢谢您,我接受了。以上是关于Visual Studio 在构建、重建和清理解决方案时使用啥 dotnet core cli 命令(或 msbuild 命令)?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio中Rebuild和Clean + Build之间的区别
无法构建或清理 Visual Studio 2015 解决方案(拒绝访问)
如果打包 UWP,Visual Studio 总是重建解决方案
并行构建 Visual Studio 解决方案会丢失一些静态库的 PDB