包含假程序集定义的VS2012项目总是重建
本文关键字:重建 项目 VS2012 程序集 定义 包含假 | 更新日期: 2023-09-27 18:13:19
最初我们在复杂的解决方案中发现了这个问题,但现在我也可以在虚拟项目中重现它。
如果我在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".
请建议我做错了什么,以及如何解决这个问题,这样项目就不会一直重建冗余。
Thanks in advance
说明一下,下面是重现这个问题的步骤:
- 创建您选择的c#项目(我尝试过单元测试和控制台应用程序)
- 在一个引用的程序集上添加一个假程序集(我在上面的例子中使用了System)
- 构建项目
- 重新构建(非重建)
请注意,您不需要在解决方案中添加任何一行代码。
尝试编辑visual studio的注册表设置。设置"U2DCheckVerbosity"=dword:00000001
在[HKEY_CURRENT_USER'Software'Microsoft'VisualStudio'12.0'General]
然后你会在输出中看到,为什么visual studio认为,完全重建是必要的。原始信息在这里
(更新)vs2017略有变化,说明在这里
要手动更新VS 2017中的"快速最新检查"注册表设置,请执行以下操作:
- 关闭VS 2017,等待20-30秒,让它释放私有注册表hive。
- 运行regedit.exe
- 选择HKEY_LOCAL_MACHINE File -> Load Hive…
- 转到文件夹%LOCALAPPDATA%'Microsoft'VisualStudio
- 选择不以Exp
结尾的15.0_*文件夹- 选择该文件夹中的privaterregistry .bin文件。例如:C:'Users'MyUserName'AppData'Local'Microsoft'VisualStudio'15.0_4eff8961' privaterregistry .bin
- 加载Hive的关键名称只需创建一个像VSTweak的名称
hive现在应该显示为HKEY_LOCAL_MACHINE'VSTweak。
- 编辑(或添加)U2DCheckVerbosity dword(32位)值为1(或0禁用):微软HKEY_LOCAL_MACHINE ' VSTweak ' Software ' ' VisualStudio ' 15.0 _4eff8961 '一般
- 选择hive根节点(例如,VSTweak)
- File -> Unload Hive…
- 确认卸载hive.
获取提示如下问题的消息:项目'Common'不是最新的。错误(0 x8000ffff)。
我一直在经历同样的问题,因为一些引用外部文件:当CopyToOutputDirectory
属性被设置为Always
时,大量的项目被一遍又一遍地重建,即使没有修改代码。
在VS2013 Update 2中,我不能通过添加假程序集来重现问题,但如果假程序集的CopyToOutputDirectory
设置为Always
或PreserveNewest
(即复制如果更新的在VS GUI中),我确实可以重现它。
在你的情况下,我会用文本编辑器仔细检查,如果.csproj包含任何这样的标签:
<Fakes Include="Fakes'mscorlib.fakes">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Fakes>
即CopyToOutputDirectory
设置为Always
或PreserveNewest
,将它们修改为
<Fakes Include="Fakes'mscorlib.fakes" />
我也遇到过同样的问题。我到目前为止,通过打印出文件及其时间戳,仔细检查了Microsoft.QualityTools.Testing.Fakes.targets中的BuildFakesAssemblies任务的输入/输出,但看不到任何具有较新时间戳的输入,即输出文件的任何时间戳(尽管,我没有检查文件大小,我认为这是是否执行msbuild Target的另一个决定因素)。它是BuildFakesAssemblies任务,它随后会触及测试项目中引用的.fakes.dll文件,这会在实际上没有任何更改时导致不必要的重新编译。
在查看.targets文件时,我注意到2013年版本的microsoft . qualitytools . testing . akes.targets文件中不包含Touch命令。所以,我改变了包含测试项目的。sln文件(格式版本12 -> 13,VS 2012 -> 2013),然后重新触发我的命令行构建,问题不再发生!希望这能帮助到下一个人!