最初我们在复杂的解决方案中发现了这个问题,但现在我也可以在虚拟项目中重现它。
如果我在VS2012 premium(更新4)中创建项目并为其中一个引用添加Fakes程序集,则无论是否进行任何更改,项目似乎都将重建。即我构建项目然后再次单击构建按钮将导致重建项目。
启用诊断构建信息,似乎问题的根本原因是编译.fakes文件的工具正在触摸.Fakes.dll文件,因此VS认为某些内容已发生变化:
1>Using "Touch" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>Task "Touch" (TaskId:11)
1> Task Parameter:
1> Files=
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1>Done executing task "Touch". (TaskId:11)
[...]
1>Input file "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll" is newer than output file "obj\Debug\UnitTestProject1.pdb".
请告知我做错了什么以及如何解决这个问题,以便项目不会一直冗余重建。
提前致谢
被修改
为了澄清,以下是重现问题的步骤:
请注意,您不必向解决方案添加一行代码。
答案 0 :(得分:1)
尝试编辑visual studio的注册表设置。在"U2DCheckVerbosity"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General]
然后你会在输出中看到为什么visual studio认为必须完全重建。 原始信息为here。
[UPDATE]
vs2017的情况略有改变,说明为here
要在VS 2017中手动更新“快速检查”注册表设置,请执行以下操作:
- 关闭VS 2017并等待20-30秒,以释放其私人注册蜂巢。
- 运行regedit.exe
- 选择HKEY_LOCAL_MACHINE文件 - >加载Hive ......
- 转到文件夹%LOCALAPPDATA%\ Microsoft \ VisualStudio
- 选择不以Exp
结尾的15.0_ *文件夹- 选择该文件夹中的privateregistry.bin文件。 例如,C:\ Users \ MyUserName \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_4eff8961 \ privateregistry.bin
- 对于Load Hive的密钥名称,只需组成一个名称,如VSTweak
配置单元现在应显示为HKEY_LOCAL_MACHINE \ VSTweak。
- 在以下位置编辑(或添加)U2DCheckVerbosity dword(32位)值为1(或0以禁用): HKEY_LOCAL_MACHINE \ VSTweak \软件\微软\ VisualStudio的\ 15.0_4eff8961 \一般
- 选择配置单元根节点(例如,VSTweak)
- 文件 - >卸载Hive ......
- 确认卸载配置单元。
- 启动VS并构建内容。
获取指示问题的消息:项目“Common”不是最新的。错误(0x8000FFFF)。
答案 1 :(得分:0)
由于对外部文件的一些引用,我一直遇到同样的问题:当CopyToOutputDirectory
属性设置为Always
时,大量项目被反复重建,即使没有对代码进行任何修改。
在VS2013 Update 2中,我无法通过添加假组件来重现该问题,但如果假组件的CopyToOutputDirectory
设置为Always
或者PreserveNewest
,我可以重现它。 <Fakes Include="Fakes\mscorlib.fakes">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Fakes>
(即在VS GUI中复制如果更新)。
在你的情况下,我会用文本编辑器仔细检查.csproj是否包含这样的标记:
CopyToOutputDirectory
即Always
设置为PreserveNewest
或<Fakes Include="Fakes\mscorlib.fakes" />
,修改它们
{{1}}
答案 2 :(得分:0)
我也遇到过同样的问题。我甚至通过打印出文件及其时间戳来仔细检查Microsoft.QualityTools.Testing.Fakes.targets中的BuildFakesAssemblies任务的输入/输出,但是看不到任何带有更新时间戳的输入输出文件的任何时间戳(但是,我没有检查我认为是否是执行msbuild目标的另一个决定因素的文件大小)。然后是BuildFakesAssemblies任务接触.fakes.dll文件,这些文件在测试项目中引用,当没有任何实际更改时会导致不必要的重新编译。
在浏览.targets文件时,我注意到2013版的Microsoft.QualityTools.Testing.Fakes.targets文件中没有包含Touch命令。所以,我更改了包含测试项目的.sln文件(格式版本12 - &gt; 13,VS 2012 - &gt; 2013),然后重新触发我的命令行构建,问题不再发生!希望这有助于下一个人!