MSBuild忽略新计算机上的项目依赖顺序

时间:2014-04-23 09:08:23

标签: .net msbuild

您好我有一个使用自定义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,那么它怎么能不构建项目呢?

2 个答案:

答案 0 :(得分:0)

  • 命令提示符是调试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)。

答案 1 :(得分:0)

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

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

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

(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框架的版本对所有检查都是相同的
  4. 无论如何 - 我希望有人读到这个并且比我更快地找到问题的根源!