如何在 MSVS 开发提示之外运行 MSBuild?

Posted

技术标签:

【中文标题】如何在 MSVS 开发提示之外运行 MSBuild?【英文标题】:How to Run MSBuild Outside of the MSVS Dev Prompt? 【发布时间】:2018-01-30 04:09:17 【问题描述】:

我最近一直忙于为我一直在设计的代码库制作正确的构建脚本,并且一直坚持让 MSBuild 为我的 Windows 构建正确编译。我正在尝试做的是从批处理脚本调用 MSBuild,而不打开 Visual Studio IDE,如果我没有从 Visual Studio 的开发人员命令提示符执行它,它似乎会一直这样做。我的脚本很简单,只要调用

start C:\Program Files (x86)\...\MSBuild\15.0\Bin\MSBuild.exe <Project>.sln

除了在其末尾标记的其他一些说明符之外,这就是我试图用来运行我的 Windows 构建的内容。这里的问题是,每当在 VS 开发提示之外调用此代码时,Visual Studio 本身就会打开,根本不会构建代码。我也找不到其他人在同样的问题上苦苦挣扎,因为它对于 MSBuild 和 Visual Studio 的集成似乎是新的。使用旧版本的 MSBuild 进行的测试表明,我可以在 Dev Prompt 之外构建我想要的项目。我是否会遗漏 Dev Prompt 中提供的一些改变可执行行为的环境变量?我似乎也找不到任何可以改变这一点的可执行说明符。

也许我对这个问题采取了完全错误的方法?我的最终目标是为消费者提供一系列构建脚本,针对他们所针对的每个平台一个,因此我绝对愿意接受其他解决方案。

【问题讨论】:

是否需要在未安装 Visual Studio 的构建服务器上运行该脚本? @VladimirSerykh 不,我要求构建平台安装了 Visual Studio。 为什么?看起来方法不正确。 【参考方案1】:

规范答案:

您可以使用带有 /build 命令行选项和项目文件名称的 devenv 命令。

或者,您可以运行 vcvars*.bat 脚本之一来设置必要的环境,然后使用 msbuild。

有关详细信息,请参阅https://docs.microsoft.com/en-gb/cpp/build/building-on-the-command-line。

更新:与上面的官方建议相反,这是我的笔记本电脑上的 VS2017 社区版。

    通过运行“VS2017 的开发人员命令提示符”所针对的 bat 文件来设置环境。 (右键单击开始菜单中的那个,然后选择“打开文件位置”,然后右键单击快捷方式并选择“属性”。对我来说是“C:\Program Files (x86)\Microsoft Visual Studio\2017 \Community\Common7\Tools\VsDevCmd.bat"。

    你应该从你的构建脚本中调用这个文件。

    cd 到你的项目目录,然后像这样使用 msbuild:

    msbuild My-project.vcxproj /p:Configuration=Release

由于某些非常奇怪的原因,如果我打开官方开发人员命令提示符,但即使设置了环境变量,从另一个命令提示符启动 devenv 也无济于事,我可以使用 devenv 方法。 (我什至比较了两个命令提示符中的环境变量集,它们是相等的。)

【讨论】:

我尝试了列出的两种方法,但我一定做错了什么。在 MSBuild 之前运行 call ...\vcvars64.bat 似乎没有任何效果,而 start ...\devenv.exe Proj.sln /build Release 也只是打开了 IDE,从不构建代码。【参考方案2】:

如何在 MSVS 开发提示之外运行 MSBuild?

如果必要的环境设置不正确,则构建命令变为“mysolution.sln”。执行它确实会启动 VS。所以你应该运行vcvars*.bat 脚本来设置必要的环境,然后使用msbuild。以下是我的一个批处理脚本,已经运行了一段时间,你可以查看一下:

@echo OFF 
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat"
echo "Starting Build for all Projects with proposed changes"

MSBuild.exe "C:\Users\Admin\Source\repos\MyTestProject\MyTestProject.sln"
pause
echo "All builds completed." 

这是测试样本结果:

更多详情请见How to create a Simple Build Script for Visual Studio from the Command Line?。

【讨论】:

以上是关于如何在 MSVS 开发提示之外运行 MSBuild?的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild Copy 失败并出现奇怪的错误消息

仅当文件数大于零时,如何在 MSBuild 中运行任务?

使用 msbuild (CLI) 编译时程序集引用损坏

如何创建一个 msbuild 目标以在“运行”目标(dotnet 运行)之后运行?

Azure DevOps 中的开发人员命令提示符

如何在 MSBuild 中自定义 C++ 编译器错误消息?