如果所有项目都指向同一个输出文件夹,“复制本地”是否重要?

时间:2012-08-20 18:46:35

标签: visual-studio-2010 visual-studio msbuild

我有大约50个项目的解决方案。

我将大部分项目(非测试项目)设置为输出到单个文件夹。

我听说“复制本地”会减慢构建时间(对于项目引用),因为它必须将文件复制到引用它的所有位置。

但是如果每个项目都复制到同一个位置,那么Visual Studio足够智能,可以看到该文件已存在而不再复制它?

所以,这是一个例子:

SolutionA
   |
   +---ProjectA (Output set to C:\MyProj)
   |
   +---ProjectB (Output set to C:\MyProj)
   |        References ProjectA
   |
   +---ProjectC (Output set to C:\MyProj)
   |        References ProjectB
   |
   +---ProjectD (Output set to C:\MyProj)
            References ProjectA

在正常的解决方案中,copy local将控制每个项目的bin \ Debug文件夹的引用副本。

但是我更新了Project Properties的“Output”部分,以便它们全部放到C:\ MyProj而不是bin \ Debug。

如果我没有为引用设置Copy Local为false,ProjectA.dll会被复制到C:\ MyProj四次吗?或者Visual Studio足够聪明,只能执行一次吗?

2 个答案:

答案 0 :(得分:2)

我认为你所问的是“是否需要时间将文件复制到自身上?”正如您所料,它没有。您可以通过在Microsoft.Build.Tasks程序集上使用Reflector或ILSpy来查看此内容,Copy类将执行该副本。它的DoCopyIfNecessary()方法包含以下代码行:

    if (string.Compare(sourceFileState.Name, destinationFileState.Name, StringComparison.OrdinalIgnoreCase) != 0)
    {
        flag = this.DoCopyWithRetries(sourceFileState, destinationFileState, copyFile);
    }

或者换句话说,如果源文件和目标文件相同,它会跳过副本。必然如此,File.Copy()将不会高兴。

答案 1 :(得分:0)

将本地副本复制到bin目录。通常Visual Studio将在Clean命令上清空此目录。如果未设置“复制本地”,则存在未在bin文件夹中包含所有引用的风险。

我可以用其他方式将它们复制到bin文件夹中;但如果你曾经运行过Clean ...

,你必须手动完成

据我所知,VS不够智能,看不到每个项目都有相同的bin目录,所以它会复制四次(尽管测试和验证)。在上面的场景中,您可能只有一个项目具有“复制本地”并避免这种情况。但是,你至少需要一个Copy Local,否则你的bin目录就不会有这个文件。

相关问题