【发布时间】:2021-11-08 21:55:46
【问题描述】:
目前正在尝试使用 MSBuild 代替 devenv 在我们的构建服务器上重新实现我们的构建过程,这样我们就不需要安装完整的 VS IDE。在使用 MSBuild 时遇到了很多问题(竞争条件、跳过共享资源而不是阻塞、父子之间的平台不一致等),我决定将每个项目一个一个地构建在单独的任务中,以消除任何并发问题,并将/p:BuildProjectReferences=false 在所有任务命令行字段中,以防止 MSBuild 将父项目的平台强加于其异构子项目。
然而,当我在 devenv 中将此选项设置为 false 时,MSBuild 会在父级的顶部文件夹中查找依赖项,而不是在 bin 中查找。例如:
ProjectB 依赖于 ProjectA
ProjectA 有 ..\bin\ProjectA.dll 作为输出。
ProjectB 将 ProjectA 引用为 ..\bin\ProjectA.dll
C:\builds\solution\ProjectB\stdafx.cpp : 致命错误 C1192: #using failed on 'C:\builds\solution\ProjectB\ProjectA.dll'
为什么 MSBuild 在父项目目录而不是 bin 中检查依赖项输出,解决此问题的选项有哪些?任何见解都值得赞赏。
PS。
经过一番努力,我找到了部分答案。对于 C++,我可以通过将相关项目引用上的 Reference Assembly Output 设置为 false 来禁用指向父项目目录的 #using 指令,然后将路径添加到 C++ 和高级下的父项目配置中的 Forced #using 文件字段.不过,这只适用于 C++ 项目。仍然不知道如何处理 C# 项目。
似乎 MSBuild 在构建 C# 项目时完全忽略 /p:BuildProjectReferences=false,然后它尝试将 x86 平台应用于其子项目,包括具有 Win32 平台代替 x86 的 C++ 项目,反过来又以某种方式导致 MSBuild 寻找它找不到的 v100 (VS 2010) 构建工具。
从那以后,我了解了一些有关 MSBuild 中控制这一点的机制的知识。显然有一个名为 AssignProjectConfiguration 的 MSBuild 任务,它有一个标记为 ShouldUnsetParentConfigurationAndPlatform 的参数。这在 VS 中设置为 true,在 MSBuild 中设置为 false。这似乎是导致配置/平台不匹配的根源。尽管我有明确的命令行说明,但为什么它会构建依赖项,以及为什么配置/平台不匹配导致它寻找 v100 VS 2010 构建工具对我来说都是一个谜。我有大量的详细输出日志可供查看。在继续阅读日志时,我将努力更新此内容。
【问题讨论】:
标签: msbuild