【发布时间】:2013-02-04 20:26:36
【问题描述】:
我有一个构建过程(我们称之为“引擎”),它一直在使用命令行调用 Visual Studio 的 devenv.exe 来构建项目。我已经知道 VS 只是使用 MSBuild 构建,所以我终于开始更新引擎以直接使用 MSBuild。但是,我发现 MSBuild 有一个奇怪的异常情况。
为了便于讨论,有项目 A、B、C 和 D。项目 A 是我正在构建的主要项目,一个网络应用程序,它依赖于(通过项目引用)其他 3 个项目。在 VS 中手动构建时,A\bin 会填充程序集。当使用 devenv.exe 内置在引擎中时,A\bin 再次填充了预期的二进制文件。在使用 MSBuild 内置引擎时,A\bin 不包含任何内容。但是,B\Release\bin、C\Release\bin 和 D\Release\bin 包含它们的二进制文件,就像使用前两种构建方法一样。
这也发生在一个项目中。该问题似乎与依赖项目无关。
我已尝试显式设置 MSBuild OutDir 属性,但似乎没有任何影响。
我已经运行了带有诊断输出的构建,但看不到任何明显的东西(当然,那里有很多东西,所以我可能还没有找到重要的东西)。
我也一直在尝试弄清楚如何查看 VS 从 devenv.exe 运行时对 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 的入口,我可能会破坏其他正在发生的事情。我确实尝试查看是否记录了从devenv 对msbuild 的调用,但似乎没有。我考虑过构建一个虚拟的 msbuild 应用程序来转储进入其中的命令并临时换出实际的 msbuild 以生成此诊断信息,但这比此时值得付出更多的努力。性能提升不是很大,现在值得进一步追求。
【问题讨论】:
-
在命令行中,您是否明确提供了配置和平台? Visual Studio 总是这样。可能是您的项目文件包含多个配置,并且您在 Visual Studio 中选择了其中之一。如果您没有明确提供平台/配置,MsBuild 将只使用默认值。
-
是的,请参阅编辑 1。应该包括...
-
您在日志中看到的项目 A 和其中一个有效项目的 %%OUTDIR%% 的值是多少?
-
这还没有添加
Platform/property:"Platform='AnyCpu'"
标签: visual-studio msbuild