一个常见的解决方案是将所有项目输出到同一个目录,并将所有引用设置为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,但是来自不同的目录或不同的版本等,所以它会被复制两次,除非你解决了这个问题。
其中一个项目应该将所有引用和CopyLocal设置为true,这是最简单和最快的。任何其他解决方案也会开始减慢构建速度,因为它们基本上必须执行与复制引用的内置方式大致相同的逻辑。 – stijn
@stijn谢谢你的建议,我一直认为它的东西,但似乎有点矫枉过正。如果我找不到其他方法,我会留下最后一个选项。 –
我想重现您的问题,看看发生了什么,但我不能:当CopyLocal = True时,用于引用的复制步骤实际上不会复制该文件(如果它没有更改)(即它只是检查时间戳并且详细的msbuild日志具有条目,例如'没有复制xxx,因为项目中的“SkipUnchangedFiles”参数设置为“true”,文件的大小和时间戳匹配)。因此:您必须提供更多信息:将CopyLocal设置为True并输出通用目录时,问题是什么?什么是慢? – stijn