【问题标题】:MSBuild ignores project dependency order on new machineMSBuild 忽略新机器上的项目依赖顺序
【发布时间】:2014-04-23 09:08:22
【问题描述】:

您好,我有一个使用自定义 msbuild 文件编译的解决方案。

最近我把我的机器从一台 Windows 7 机器换成了一台新的 Windows 8.1 机器。

在新机器上运行 msbuild 时,它无法构建解决方案,显然是因为它忽略了应该在其他项目之前构建的依赖项目。我的旧机器上的同一组文件不会发生这种情况。

  • 两者都在运行 MSBuild 12.0.21005.1
  • 两者都安装了 VS 2012 和 2013
  • .NET Framwork v4 的补丁号在几个内部版本号之内,两者都在 4.0.30319.xxxx

这让我发疯了——新机器的全部意义在于更快地构建这个解决方案:)

任何人都可以提出明智的步骤来解决或至少诊断此问题吗?

更新:似乎 msbuild 认为没有任何变化。我收到了诸如Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files. 之类的消息,否则我似乎无法说服它。进程运行Clean,然后Build,那么它怎么可能不构建项目呢?

【问题讨论】:

  • 并行构建功能是常见问题。您将获得更多构建以与具有更多内核的机器并行运行。由于一个项目的构建速度过快,并且它依赖于另一个尚未完成的项目的构建输出,因此导致构建失败的可能性非零。换句话说,当项目依赖项从一开始就没有正确设置,但你以前从未注意到它时。
  • 我们已经并行构建了 8 个月。这不是改变的东西。另外具体来说,我也尝试过在我的构建中不使用 /m,因此它正在串行编译,但仍然失败。
  • 获得帮助的唯一可能方式是发布“自定义 msbuild 文件”以及从 msbuild 中获取的构建日志,并将输出详细程度设置为“诊断”。跨度>

标签: .net msbuild


【解决方案1】:
  • 命令提示符是调试 MSBuild 的最佳朋友。更具体地说,Developer Command Prompt for VS2012\2013

  • 从任何以前的构建二进制文件中验证构建机器是否干净。您的构建脚本应该在编译之前清理其工作区(除非它由构建服务器处理)。如果使用 TFS,请运行 tfpt treeclean

  • 使用诊断日志运行构建 - msbuild build.proj /flp:Verbosity=diagnostic;LogFile=build.log

  • 在没有并发的情况下运行构建 - /m:1。对于多个处理器,当/m 开关处于活动状态时,并发进程可能会导致复杂构建失败。

  • 验证是否执行了正确的 MSBuild 映像。强制使用完整路径 (C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe)。

【讨论】:

  • 我正在使用 dev 命令提示符。即使将 repo 安装到新机器上也会出现问题(我删除了整个东西并多次更换。它适用于其他机器,但不是这台机器。我会尝试非常具体的 /m:1,尽管我认为没有 /m 它只会编译一个 1 核心
【解决方案2】:

经过多次狩猎,我有了答案。

首先 - 由于文件是最新的,它似乎与跳过没有任何关系。

通过将构建结果输出到文本文件,我能够找到在旧机器上构建时不存在的几行,包括以下警告:

(ResolveAssemblyReferences target) -> 
C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1635,5): warning MSB3274: The primary reference "Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" could not be resolved because it was built against the ".NETFramework,Version=v4.5" framework. This is a higher version than the currently targeted framework ".NETFramework,Version=v4.0". [C:\workspaces\git\soln\src\Orchard.Web\Modules\Orchard.Workflows\Orchard.Workflows.csproj]

我们之前已将主要 Web 项目更新为面向 .NET Framework 4.5,但解决方案中的一些项目已保留在 4.0 版上。这在我的旧机器上运行良好(留在 4.0 上的那些不应该引用针对 4.5 构建的任何东西),但显然在新机器上存在问题。

凭直觉,我使用这个很棒的工具 http://visualstudiogallery.msdn.microsoft.com/47bded90-80d8-42af-bc35-4736fdd8cd13 升级了解决方案中的所有项目(全部 119 个),之后构建成功。

我应该明确指出

  1. 两台机器上的代码库完全相同
  2. 我们以前从未遇到过需要升级附加项目的目标版本的问题,只是在这台机器上
  3. msbuild 和 .NET 框架的版本经检查,完全相同

无论如何 - 我希望有人阅读本文并比我更快地找到问题的根源!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多