【问题标题】:MSBuild not copying compiled binaries to <app>\binMSBuild 未将编译后的二进制文件复制到 <app>\bin
【发布时间】: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\binC\Release\binD\Release\bin 包含它们的二进制文件,就像使用前两种构建方法一样。

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

我已尝试显式设置 MSBuild OutDir 属性,但似乎没有任何影响。

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

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

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

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

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

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

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

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

【问题讨论】:

  • 在命令行中,您是否明确提供了配置和平台? Visual Studio 总是这样。可能是您的项目文件包含多个配置,并且您在 Visual Studio 中选择了其中之一。如果您没有明确提供平台/配置,MsBuild 将只使用默认值。
  • 是的,请参阅编辑 1。应该包括...
  • 您在日志中看到的项目 A 和其中一个有效项目的 %%OUTDIR%% 的值是多少?
  • 这还没有添加Platform /property:"Platform='AnyCpu'"

标签: visual-studio msbuild


【解决方案1】:

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

【讨论】:

  • 我已将测试简化为单个项目,如原帖所述,问题仍然存在。所以我确信这个问题与依赖无关。我检查了输出路径。我不确定在这种情况下你可能认为什么是错误的。它设置为 bin\,并且在 VS IDE 中构建并使用 CLI 调用 devenv 时工作正常。只有在 MSBuild 中才不会复制二进制文件。我没有任何 SLN 宏。
  • 他们四个都只是 bin\ 吗?还是其他 3 个不同。
  • 在几个测试用例中,是的,项目都配置为输出到`bin`。但是,此时我已将测试减少到不引用任何内容的单个独立库,并且仍然会发生这种情况。这种模式似乎是依赖项的二进制文件被复制到“最顶层”项目下一层的依赖项目。
【解决方案2】:

您应该设置OutputPath 而不是OutputDir

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多