我有一个构建过程(让我们称之为“引擎”),它一直使用对Visual Studio的devenv.exe的命令行调用来构建项目。我已经知道VS正在构建MSBuild,所以我终于更新了引擎以直接使用MSBuild。但是,我发现MSBuild有一个奇怪的异常现象。
为了讨论,有项目A,B,C和D.项目A是我正在构建的主要项目,一个Web应用程序,它依赖于(通过项目引用)其他3个项目。在VS中手动构建时,A\bin
将填充程序集。当使用devenv.exe
A\bin
在引擎中内置时,将再次填充预期的二进制文件。当在引擎中内置使用MSBuild时,A\bin
不包含任何内容。但是,B\Release\bin
,C\Release\bin
和D\Release\bin
包含二进制文件,就像使用前两种构建方法一样。
只有一个项目也会发生这种情况。该问题似乎与依赖项目无关。
我试图明确设置MSBuild OutDir
属性,但似乎没有任何影响。
我已经运行了带有诊断输出的构建,并且看不到任何明显的东西(已批准,有很多东西,所以我可能还没有找到重要的东西)。
我一直在试图弄清楚如何在devenv.exe
运行时看到VS正在进行的MSBuild命令行调用,但我似乎无法找到它。
我查看了其他几篇SO帖子(here和here),但它们不是同一个问题。
任何人都知道这可能是什么,或者我可以在哪里寻找答案或更多诊断信息?
编辑1:用于调用MSBuild的参数模式如下所示:
/nologo /target:Compile /property:Configuration=%%BUILDCONFIG%% /maxcpucount
/property:OutDir=%%OUTDIR%%\bin\ /verbosity:diag /detailedsummary "%%PROJPATH%%"
下半部分显示我尝试强制输出目录以及增强输出以显示进程的更多详细信息。构建引擎代码替换为“%% TOKEN %%”项目,并为正在构建的项目提供适当的替换值。
编辑2:经过更多研究并研究提供的建议后,我决定放弃使用msbuild
代替devenv
的努力。似乎还有更多的事情在devenv
的引导下进行,准备自己调用msbuild
,如果我不完全理解msbuild
的入口,我可能会打破其他事情。 1}}。我确实试图查看是否记录了来自msbuild
的{{1}}的来电,但似乎没有。我已经考虑构建一个虚拟的msbuild应用程序,只是转储进入它的命令并临时交换实际的msbuild来生成这个诊断信息,但这比它在这一点上的价值更多。性能提升不是很大,现在值得进一步追求。
答案 0 :(得分:0)
我会查看项目属性的构建选项卡上的输出路径。使用MSBuild和使用Visual Studio(甚至从命令行)时,差异很小。可能是你配置的A与B,C,D不同,其余的同步A将使其工作。此外,如果您计划单独构建项目,而不是作为解决方案,请确保您不使用项目文件本身无法使用的解决方案级别宏。
答案 1 :(得分:0)
您应该设置OutputPath
而不是OutputDir
。
由于您已经使用过/verbosity:diag
,为什么不将输出重定向到文本文件并仔细分析csc.exe(或其他正在使用的编译器)存储二进制文件的位置?这对于您了解MSBuild如何在幕后工作非常简单且信息丰富。