c# – 如何使多个.net项目在构建中只复制一次引用

我有一个包含多个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但是来自不同的目录或不同的版本等,所以除非你修复它,否则它将被复制两次,无论如何.

上一篇:Xamarin.Android android:versionCode android:versionName – 来自Jenkins Build Server


下一篇:使用新的csproj在PDB中嵌入C#源代码