大约两周前,我注意到每次运行启动项目时,Visual Studio都会构建所有项目,大约需要七分钟的时间。不用说,这占去了我很多时间,我已经尽力在网上寻找解决方案,但尚未找到解决特定问题的任何解决方案。
还有一些额外的信息-与我同时期,我的团队中其他人也遇到了同样的问题。
我们还使用源代码库。由于我们没有更改Visual Studio的任何设置,因此我的怀疑是某人无意中更改了某个项目的源代码,现在需要每次构建所有项目。
如果您有任何建议,将不胜感激。
可能的原因有很多,如果没有你的解决方案和项目,我们只能猜测。
我通常处理这个问题的方式是通过二分查找来缩小范围。也就是说,
当然,这仅适用于引入新问题的单个项目(这很可能是情况)。
在我的具体情况中,其中一个罪魁祸首是将 x64 项目引用了一个未在 x64 配置中选择构建的 x86 项目。
我将在这里分享我在stackoverflow上找到的最佳答案,并结合Matt Smith在此处接受的答案,我已经找到了我的问题的根本原因:
通过配置Visual Studio以“诊断”方式记录构建输出,如此答案中所述:https://dev59.com/VWUp5IYBdhLWcg3w8bNB#29649259,输出的第一行就解释了MSBuild确定重新构建项目的原因。
因此,假设您在一个解决方案中有3个项目:
这样引用:应用程序引用Library1,而这个项目引用Library0。选择“生成”应用程序项目时,第一次它应该按顺序构建所有引用的项目。但是,从现在开始,如果没有进行任何更改,按下“生成”按钮不应该构建任何东西,因为MSBuild检测到没有进行更改。类似的日志输出应该显示:
========== Build: 0 succeeded, 0 failed, 3 up-to-date, 0 skipped ==========
但是现在,如果进行了更改,如果您将MSBuild日志输出级别设置为“诊断”,则输出窗口中的第一行将显示Visual Studio决定构建项目的原因,如下所示:
Project 'Library0' is not up to date. Input file 'c:\Library0\Class1.cs' is modified after output file 'c:\Library0\bin\Debug\Library0.pdb'.
进入“工具”菜单->“选项”->“项目和解决方案”->“生成和运行”。
查看这里的选项。应该勾选“只在运行时构建启动项目和依赖项”。
此外,您还可以将构建输出(在同一选项屏幕上)设置为详细或诊断,以查看是否可以找到任何线索,为什么每次都要构建项目。
根据我的经验,只有部分项目需要重新构建,而且在多次失败后才最终成功。这显然是由于\rootprojectdir\.vs\%projectname%\v14\.suo
文件损坏所致。这也导致相同的项目需要重新构建,并且每次打开VS时都要打开相同的窗口。关闭VS并删除.suo文件,重新打开VS即可解决问题 :)
我发现了另一个导致重建的原因(至少在新的sdk-style项目文件中,没有尝试过旧式项目):如果.csproj文件中的元素与app.config中条目的sku属性不匹配,则Visual Studio也会每次都重新构建项目。
例如,在.csproj中以4.6.2为目标:
<TargetFramework>net462</TargetFramework>
那么在app.config中应该这样写:
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
这样可以避免不必要的重建。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net462</TargetFramework>
</PropertyGroup>
</Project>
vs. 4.6.1 specified in app.config
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
</startup>
</configuration>
工具 -> 选项 -> 项目和解决方案 -> 构建和运行
将输出详细程度设置为“诊断”。进行另一次构建后,检查输出窗口。在每个项目构建的开始,构建系统将告诉您哪个依赖项导致了该项目的构建。
(在我的情况下,是一个.ico文件意外地被设置为构建操作:资源
和复制到输出目录:仅在更改时复制
。非常难找。)
对于SDK样式的项目,现在还有“项目和解决方案” -> “SDK样式项目” -> “日志记录级别”。在调试增量构建时,将其设置为“详细信息”。
在我的情况下,由于AutoGenerateBindingRedirects,期望有一个.dll.config
,但没有找到。这导致增量构建失败。最终发现是Visual Studio中的一个错误,通过删除一些与项目相关的缓存文件来解决。
我来这里是为了解决自己的问题,但所提供的答案都没有解决我的问题。
经过调查,我发现在xaml
文件的Copy to Output Directory
属性值设置为Copy always
或Copy if newer
时,UWP项目每次都会被编译。过去,这可以帮助解决一些编译问题,但自从xbf
引入后,即使没有更改任何源代码,这些文件上的这些值也会强制Visual Studio每次重新编译。
我写了一篇博客文章介绍此问题:Preventing Visual Studio Recompiles in UWP
希望能对某人有所帮助。