0

我有一个构建过程(我们称之为“引擎”),它一直在使用命令行调用 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\binC\Release\bin包含D\Release\bin它们的二进制文件,就像使用前两种构建方法一样。

这也发生在一个项目中。该问题似乎与依赖项目无关。

我试图显式设置 MSBuildOutDir属性,但它似乎没有任何影响。

我已经运行了带有诊断输出的构建,但看不到任何明显的东西(当然,那里有很多东西,所以我可能还没有找到重要的东西)。

我也一直在试图弄清楚如何查看 VS 在运行时对 MSBuild 的命令行调用,devenv.exe但我似乎找不到它。

我查看了其他几个 SO 帖子(此处此处),但它们不是同一个问题。

任何人都知道这可能是什么,或者我可以在哪里寻找答案或更多诊断信息?

编辑 1:用于调用 MSBuild 的参数模式如下所示:

/nologo /target:Compile /property:Configuration=%%BUILDCONFIG%% /maxcpucount 
  /property:OutDir=%%OUTDIR%%\bin\ /verbosity:diag /detailedsummary "%%PROJPATH%%"

下半部分显示了我尝试强制输出目录以及增强的输出以显示该过程的更多细节。构建引擎代码替换为“%%TOKEN%%”项,并为正在构建的项目使用适当的替换值。

编辑 2:经过更多研究并研究提供的建议后,我决定放弃使用msbuild而不是devenv. 似乎devenv在准备自己调用的引擎盖下还有很多msbuild事情要做,如果我不完全理解msbuild. 我确实尝试查看是否记录了对msbuildfrom的调用devenv,但似乎没有。我考虑过构建一个虚拟的 msbuild 应用程序来转储进入其中的命令并临时换出实际的 msbuild 以生成此诊断信息,但这比此时值得付出更多的努力。性能提升不是很大,现在值得进一步追求。

4

2 回答 2

0

我会查看项目属性的构建选项卡上的输出路径。使用 MSBuild 和使用 Visual Studio 时(即使从命令行)也有很多不同之处。可能是您的 A 配置与 B、C、D 不同,并且将 A 与其余部分同步将使其正常工作。此外,如果您计划单独构建项目,而不是作为解决方案,请确保您不使用对项目文件本身不可用的解决方案级别宏。

于 2013-02-04T22:17:58.377 回答
0

你应该设置OutputPath而不是OutputDir.

既然您已经使用过/verbosity:diag,为什么不将输出重定向到文本文件并仔细分析 csc.exe(或正在使用的其他编译器)存储二进制文件的位置?这对于您了解 MSBuild 如何在后台工作非常简单且内容丰富。

于 2013-02-05T02:32:28.680 回答