我已经和它搏斗了几天,经过大量的搜索,我找不到我应该走的路.
我想要做的是建立一个MSBUILD项目,它将构建我们的整个.NET应用程序(8个解决方案的常量,可能有250个项目在它们之间拆分),并从单个项目文件中覆盖了许多设置以进行调试构建为了我自己.
具体来说,我想构建我们的发布配置,优化关闭并生成完整的调试信息/ pdbs.另外,为了减少我们当前超长的构建时间,我希望每个项目的每个引用都"复制本地"(或实际的proj文件xml中的私有)为false.
第一件事情相当简单,我可以相当轻松地覆盖项目级属性(你甚至可以使用/ p从MSBuild命令行执行此操作),但我无法弄清楚如何覆盖引用上的属性.我已经尝试过在StackOverflow和网络上看到的几件事,但还没有解决方案.
我可以通过改变Microsoft.Common.targets做我想做的事情,注释掉_CopyFilesMarkedCopyLocal目标中的代码完全跳过这些文件的复制.但我不想改变我的全局配置并在所有情况下都这样做.我创建了自己的备用目标文件 - 如果我将单个项目文件更改为指向它,则可以正常工作 - 但我无法弄清楚如何指定它在顶层使用(我的.proj文件只是构建所有8种解决方案).如果我能以某种方式覆盖顶层的_CopyFilesMarkedCopyLocal目标,那将是很好的,这样如果MS更改默认目标文件,我的构建不会搞砸,但我也无法弄清楚如何使这项工作.
最好的办法是,如果有一种方法可以覆盖引用级属性,就像你可以项目级属性一样,而不必重写/覆盖构建目标的东西 - 但是我没有发现任何可能的信息.
在此先感谢任何帮助.
PS我实际上不可能只浏览所有项目文件并进行更改; 我需要一个解决方案,将现有代码保留原样.
我的情况
在C#项目中我正在研究我们有一个相当大的解决方案(80多个项目).现在重建时间为5分钟+使用Visual Studio 2008中的 MSBuild确实变得非常困难.
在我上周做的分析中,我发现我的构建时间花费如下:
将文件复制到项目并将其重新复制到依赖于它的项目(CopyToLocal)等(60%)
调用postbuild进行反编译/编译.(20%)
进行实际编译等(20%)
除了'普通'项目bin\debug文件夹输出也被复制到外部目录以设置主'加载'程序.主程序结构有点像这样:
\loader\bin\loader.exe
\loader\plugin\plugin1\plugin1.dll
\loader\plugin\plugin1\somedependency.dll
Run Code Online (Sandbox Code Playgroud)
我做了什么
为了让事情变得更快,我想到了以下几点:
将所有文件复制到一个大bin目录,不要使用CopyTolocal.我不喜欢这个,因为我们不能再使用相同DLL文件的不同版本,而且我的bin目录变得非常混乱.
对MSBuild使用并行性(/ m).这对构建时间的帮助很小.
尝试减少项目之间的依赖关系,这当然是一件好事.
投资硬件.我发现了一些关于固态驱动器的研究,但这似乎并不乐观.
我的问题
我还注意到,当我对依赖树的根目录下的项目进行更改时,所有内容都会重建.即使改变仅在"私人"部分,并且项目的界面没有改变.
MSBuild是否使用依赖项目的时间戳来确定项目是否需要重建?
这可以改为不同的条件吗?例如,文件的校验和?
除了这个特定的建议,我一定会感谢所有建议,以使构建时间更快.