Visual Studio(2012、2015)在项目未更改时重新构建项目

13

我有一个相当大的解决方案(约50个项目,全部是C#),我正在VS 2012(更新4)中构建它。我注意到,在从VS内完成完整重建后,直接按F6进行构建会导致一个项目重新构建,尽管我没有碰过任何东西。

第二次构建的调用正确地检测到所有项目都是最新的。

将msbuild输出设置为详细诊断并检查第一次构建调用的输出会显示如下:

NuGet package restore started.
Restoring NuGet packages for solution XXX.
[... some boring lines on NuGet Package restore]
All packages are already installed and there is nothing to restore.
NuGet package restore finished.
Project 'YYY' is not up to date. Last build was with unsaved files.
------ Build started: Project: YYY, Configuration: Debug Any CPU ------
Build started 21-11-2013 21:20:54.

我对“项目‘YYY’不是最新的。上次构建时使用了未保存的文件”这个消息特别感兴趣。我没有未保存的文件。有趣的是,当在Google和Bing上搜索此消息时,它们都没有给出任何结果。

有什么线索可以解释这是什么原因吗?如何调试构建过程中的这一部分?我相信这一部分的构建过程甚至比MsBuild的调用更早(至少新的NuGet Package Restore功能在MsBuild被调用之前启动,我相信MsBuild从“Build started”行开始启动)。


这个项目是否在其他项目方面有“一些特殊”的设置?这个项目是什么类型? - Micha
只是一个普通的类库。我检查了所有具有“始终复制”输出目录设置的项目,没有发现任何问题(这些可能会出错)。我还删除了任何*.suo文件,以确保安全。由于某种原因,VS仍然认为某个文件有未保存的更改,我无法找出原因。 - Ralph Hendriks
嗯...也许与其他项目有特殊的关联或依赖... - Micha
1
在执行构建之前和之后比较源目录内容,发现类库的obj\Debug中有一个build.force文件,使得VS认为存在未保存的更改。您有什么想法是构建过程的哪个部分会将此文件放置在那里? - Ralph Hendriks
有趣。受影响的项目是用哪种语言编写的? - Micha
1
受影响的项目以及解决方案中的所有其他项目都是用C#编写的。同时,我发现使用ProcMon,它是devenv.exe写入build.force文件,而不是msbuild。 - Ralph Hendriks
2个回答

4
这可能是因为您的项目存在循环引用。要检查这个问题,请将MSBuild项目构建输出详细程度设置为诊断模式。

构建解决方案并在构建输出窗格中搜索:

Done executing task "Copy"

在这条线的上方,你会看到像这样的行:

Did not copy from file
Copying file from 

你会看到像这样的行:
3>  Copying file from "C:\Projects\test\Business.Core.Mto\bin\Debug\Business.Core.Mto.dll" to "bin\Debug\Business.Core.Mto.dll". (TaskId:68)

你可以忽略非dll文件的复制。

查找包含“Done executing task "Copy"”文本的原始行。

现在,你会看到类似于这样的一行:

3>Done building target "_CopyFilesMarkedCopyLocal" in project "Business.Core.Utils.csproj".: (TargetId:138)

在Visual Studio中,打开该项目的引用。删除所有引用并重新添加它们。您可能会收到以下消息:

A reference to business.core.mto could not be added. Adding this project as a reference would cause a circular dependency

现在可以构建解决方案。

在移动项目和重构时,引用可能已经被孤立,不再需要。


另一个可能的原因是配置文件被设置为始终复制而不是仅在新的时候复制。 - Brian Leeming
这里有非常好的见解...我通过查看意外的副本在我们的解决方案中发现了一个类似的问题,在更改了那个特定的文件之后,项目不再一直重新编译。 - julealgon

2

好的,我最终自己解决了这个问题。我显然忽视了一个没有设置为项目依赖项的依赖项。这是必要的,因为解决方案中并不是所有项目都通过项目引用链接,而是通过普通的二进制引用链接(因为子集项目也可以在部分解决方案中打开,以加快加载速度等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接