【发布时间】:2013-02-01 17:28:46
【问题描述】:
所以,正如标题所示,我现在有一个 VS2010 解决方案,其中包含大约 50 个项目。如果我对没有任何引用的“顶级”项目进行更改,那么 VS 仍然会重建所有 50 个项目。我正在运行没有任何附加组件的 Visual Studio 2010 Ultimate。我正在使用 ILMerge 将所有项目合并到一个文件中。
我已经通过检查较低级别 dll 的时间戳来验证这一点,并看到它们确实被重建了,即使它们的代码没有被触及。
我已阅读以下所有回复和 cmets:
Visual Studio 2008 keeps rebuilding
Visual studio keeps building everything
Strange VS2010 build glitch occurs in my solution
Reasons for C# projects to rebuild in Visual Studio
但他们中的大多数只是提供有关卸载项目以加快构建时间的建议,但没有具体的修复方法。我试图弄清楚为什么 VS 认为这些依赖项目需要重建,而他们不这样做并修复它。
我已打开“工具 > 选项 > 项目和解决方案 > 构建和运行 > 仅构建启动项目和运行时的依赖项”,但没有任何效果。
另外,如果我只是重建一个只有 8 个(内)直接依赖项的“中级”项目,那么即使没有调用 ILMerge 并且没有修改任何依赖项目,它仍然会构建所有 8 个项目。
感谢大家提供的任何见解。
已添加
为了测试一些建议,我从头开始创建了一个新的 WinForms 项目。然后,我在该解决方案中创建了两个新项目。我将两个“最低级别”项目中的所有代码和资源(不是项目文件)复制到两个全新的项目中(我通过将文件和文件夹从资源管理器拖放到 Visual Studio 中的项目中)。
最低的项目,我们称之为B,没有引用任何其他项目。下一个项目 A 仅引用了 B。因此,一旦我将所需的 .NET 和外部程序集引用添加到项目中,就会构建解决方案。
然后我获得了我的新 WinForm 项目参考 A 并进行了完整构建。所以参考链是:
WinForm -> A -> B
然后我修改了 WinForm 仅 并进行了标准构建 (F6)。和以前一样,Visual Studio 重建了所有三个项目。
在项目B中对源文件进行了一些系统性删除后,我发现如果我删除了我的Resources.Designer.cs和Resources.resx(并注释掉了使用.Properties.Resources对象的代码这些资源)然后修改 WinForm 将不再重建整个解决方案,只会重建 WinForm。
将Resources.resx 和Resources.Designer.cs 添加回项目B(但将引用的代码注释掉,这样就不会使用资源)将重新引入完整的构建行为。
为了查看我的资源文件是否已损坏,我再次删除了它们,然后创建了一个新文件(通过项目属性 -> 资源)并重新添加了与以前相同的资源,即单个 Excel 文件。使用此设置,仍会进行完全重建。
然后我删除了单个资源,但将资源文件留在了项目 B 中。即使没有添加资源,但资源文件仍在项目中,也会发生完整的(不需要的)重建。
似乎只要将资源文件添加到 (.NET 3.5) 项目中,就会导致 Visual Studio 2010 始终重新构建该项目。这是错误还是预期/预期的行为?
再次感谢大家!
【问题讨论】:
-
你可以试试直接用msbuild构建它,看看它是否仍然发生
-
我的理解是 VS 调用 msbuild(并且项目基本上是一个 msbuild 脚本stackoverflow.com/questions/1497344/…)所以我不确定这会改变什么。我怀疑我最终会重新创建相同的构建脚本,然后从命令行运行它。是否有某种方式可以直接运行 msbuild 会有所不同?或者也许有什么方法可以找出为什么 msbuild 认为项目需要重建?
-
您是在建造还是在重建?
-
正常构建 (F6),有时仅项目构建 (Shift-F6)。两者都表现出相同的行为,尽管“仅项目构建”的重建项目的范围仅限于当前项目的直接和间接依赖项。
-
@MattKlein 是的,我感觉 VS 确实在内部运行 msbuild,但也许它调用它的方式可能有所不同,您可以通过执行“msbuild”从命令行 msbuild sln 文件mysol.sln"
标签: c# visual-studio-2010 visual-studio msbuild ilmerge