我有一个包含多个MVC和库项目的解决方案,这个解决方案的构建非常慢.
为了提高构建性能,我将所有项目更改为在同一文件夹中输出,并将所有项目引用更改为copy local = false,这使得构建性能几乎提高了90%,从10m到1m30s.
但是,这会产生一个问题,在运行模式下,我的应用程序显示错误,因为输出文件夹中没有引用程序集.
我想知道是否存在一种方法,使解决方案只将引用复制一次到我的输出文件夹.
我尝试了一些东西,比如将目标从packages文件夹复制到输出文件夹,但这不能正常工作,因为在一个包文件夹中可以存在来自许多框架版本的dll.
有什么想法解决这个问题吗?
解决方法:
一个常见的解决方案是将所有项目输出到同一目录,并将所有引用设置为CopyLocal = False,然后有一个额外的项目(或现有的项目,如主应用程序),目标是相同的输出目录,并包含所有项目引用并具有CopyLocal = True.然后,这个项目有效地将所有引用都放在您想要的位置.为了让所有项目都使用相同的输出目录,我建议修改.csproj文件以导入相同的文件,该文件设置OutputPath属性,而不是在每个项目中手动更改它.
或者,由于您提到单个输出目录的主要问题而且CopyLocal设置为True,因此某些文件会被多次复制,您可以修改复制的方式.通常,默认情况下,使用的复制任务将跳过具有匹配时间戳的文件.这是由SkipCopyUnchangedFiles标志控制的,因此您可以强制它为true并查看是否更改了任何内容:
msbuild my.sln /p:SkipCopyUnchangedFiles=True
或者您甚至可以要求它使用硬链接而不是复制,这实际上应该意味着根本不会制作副本:
msbuild my.sln /p:CreateHardLinksForCopyLocalIfPossible=True
或符号链接:
msbuild my.sln /p:CreateSymbolicLinksForCopyLocalIfPossible=True
如果所有其他方法都失败并且文件仍然被复制多次,则可能意味着例如一个项目引用A.dll而另一个项目也引用A.dll但是来自不同的目录或不同的版本等,所以除非你修复它,否则它将被复制两次,无论如何.