2017-08-28 25 views
4

我有多个MVC和库项目的解决方案以及该解决方案的构建是非常缓慢的。如何使多个.NET项目复制只引用一次在构建

为了提高构建性能,我将所有项目更改为在同一文件夹中输出,并将所有项目引用更改为copy local = false,这使构建性能从10m提高到了90%,达到了1m30s。

然而,由于在输出文件夹中没有引用组件这产生一个问题,在运行模式下我的应用程序显示错误。

我想知道是否存在的方式,使溶液中的引用只复制一次到我的输出文件夹。

我想出头,就像一个目标到的dll从包文件夹复制到输出文件夹,但这无法正常工作,因为可以从许多framework版本存在的DLL一个包文件夹。

任何IDEIA来解决这个问题?

+1

其中一个项目应该将所有引用和CopyLocal设置为true,这是最简单和最快的。任何其他解决方案也会开始减慢构建速度,因为它们基本上必须执行与复制引用的内置方式大致相同的逻辑。 – stijn

+0

@stijn谢谢你的建议,我一直认为它的东西,但似乎有点矫枉过正。如果我找不到其他方法,我会留下最后一个选项。 –

+0

我想重现您的问题,看看发生了什么,但我不能:当CopyLocal = True时,用于引用的复制步骤实际上不会复制该文件(如果它没有更改)(即它只是检查时间戳并且详细的msbuild日志具有条目,例如'没有复制xxx,因为项目中的“SkipUnchangedFiles”参数设置为“true”,文件的大小和时间戳匹配)。因此:您必须提供更多信息:将CopyLocal设置为True并输出通用目录时,问题是什么?什么是慢? – stijn

回答

1

一个常见的解决方案是将所有项目输出到同一个目录,并将所有引用设置为CopyLocal = False,然后将一个额外的项目(或现有的项目,如主应用程序)定位到同一个输出目录并且其中包含全部引用并且具有CopyLocal = True。然后,一个项目有效地照顾到你想要的所有引用。为了让所有项目使用相同的输出目录,我建议修改.csproj文件,以便全部导入设置OutputPath属性的相同文件,而不是在每个项目中手动更改它。

或者,因为你有一个单独的输出目录中提到的主要问题和CopyLocal设置为True的是,一些文件会被复制多次,你可以修改的复制是如何发生的。通常,默认情况下,使用的复制任务将跳过具有匹配时间戳的文件。这是由SkipCopyUnchangedFiles标志控制的,所以你可以强制其真,看看有没有改变任何东西:

msbuild my.sln /p:SkipCopyUnchangedFiles=True 

或者你甚至可以问它使用硬链接,而不是复制,这应该有效地意味着没有副本的制作所有:

msbuild my.sln /p:CreateHardLinksForCopyLocalIfPossible=True 

或符号链接:

msbuild my.sln /p:CreateSymbolicLinksForCopyLocalIfPossible=True 

如果一切都失败和文件仍在复制不止一次,这可能意味着如一个项目引用A.dll,另一个引用A.dll,但是来自不同的目录或不同的版本等,所以它会被复制两次,除非你解决了这个问题。

相关问题