我有一个构建过程(我们称之为“引擎”),它一直在使用命令行调用 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
它们的二进制文件,就像使用前两种构建方法一样。
这也发生在一个项目中。该问题似乎与依赖项目无关。
我试图显式设置 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
. 我确实尝试查看是否记录了对msbuild
from的调用devenv
,但似乎没有。我考虑过构建一个虚拟的 msbuild 应用程序来转储进入其中的命令并临时换出实际的 msbuild 以生成此诊断信息,但这比此时值得付出更多的努力。性能提升不是很大,现在值得进一步追求。