使用msbuild构建解决方案文件

52

我准备使用msbuild构建Visual Studio解决方案文件。我使用了以下命令行来构建该解决方案。

msbuild.exe SolutionFile.sln /t:Build/p:Configuration=Release;Platform=Win32

即使构建开始了,但构建在某个点上看起来卡住了,并且无法继续进行,如下所示。
Done Building Project "D:\SolutionPath\ProjectFile10.vcxproj" (default targets).

SolutionFile.sln下面有许多.proj需要构建。

我必须使用msbuild.exe而不是devenv.com


1
请提供更多信息或MSBuild输出,现在无法回答。 - stijn
1
你需要在参数之间加上空格。msbuild.exe SolutionFile.sln /t:Build /p:Configuration=Release;Platform=Win32 - nawfal
2个回答

35

有一种技术可以诊断msbuild内部发生了什么,这可能有助于您弄清楚这里发生了什么。从命令提示符中设置一个环境变量:

set msbuildemitsolution=1

一旦您运行了msbuild,它将生成一个.metaproj文件。该文件是msbuild内部使用的,但随后会被删除。您可以阅读它以查找实际目标的名称。 Build目标被扩展以显示它实际调用的内容。然后,您可以使用msbuild的/t标志构建单个目标,以确定哪个目标导致问题。


2
在此添加链接,因为它解释了如何显示此输出。您必须从不同的命令行设置此属性。非常好的建议。https://dev59.com/Tm865IYBdhLWcg3wTcpY - SoftwareCarpenter

30

将详细度属性设置为诊断并将输出保存到文件中。这将帮助您确定解决方案中哪个项目挂起,并帮助诊断问题。

以下是将输出保存到名为MyProjectOutput.log的文件的命令行语法:

msbuild SolutionFile.sln /t:build /fl /flp:logfile=MyProjectOutput.log;verbosity=diagnostic

似乎您需要在列出的命令中/t目标后添加一个空格来构建传递的参数。
msbuild.exe SolutionFile.sln /t:Build /p:Configuration=Release;Platform=Win32

此外,你确定每个项目都包含“Release”和“Win32”配置吗?你可以尝试运行下面的命令,看看会编译哪些内容。Msbuild会自动运行默认目标和所需配置。
msbuild SolutionFile.sln

另一个选项是尝试编译项目并查看产生的结果:

msbuild "D:\SolutionPath\ProjectFile10.vcxproj" /fl /flp:logfile=MyProjectOutput.log;verbosity=diagnostic

这个在解决方案中的.NET Core项目上也适用吗? - ryanwebjackson
1
MSBuild已经移植到了.NET Core,并且可以在任何.NET Core支持的平台上运行。 - SoftwareCarpenter
换句话说,是的,MSBuild用于构建.Net核心平台。它是构建引擎,所以是的。 - SoftwareCarpenter
我使用了 msbuild.exe SolutionFile.sln /t:Build /p:Configuration=Release /p:Platform=Win32 替代你的第二个命令。我认为你需要为每个参数使用 /p: 代替 /property:,而且不能使用由分号分隔的参数列表。 - John Doe
1
@JohnDoe 这是内置于msbuild中的快捷方式。您可以指定 /p: 一次并使用; 分隔属性。两种方法都可以,但Msbuild非常多样化。 - SoftwareCarpenter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接