什么时候copy-local应该设置为true,什么时候不应该?

时间:2009-03-02 15:32:24

标签: .net msbuild reference copy-local

我想知道何时为引用设置copy-local=true是否有任何启发式方法?

如果引用的类型仅在内部使用,我可以将copy-local设置为true但如果引用的类型作为参数公开或返回值,我将copy-local设置为false并指示当我的库应该被使用时,应该引用特定版本的依赖项吗?

有人可以为我澄清这个吗?

7 个答案:

答案 0 :(得分:58)

复制本地对于部署方案和工具非常重要。作为一般规则,如果引用未包含在GAC中,则应使用CopyLocal = True。

Copy Local本质上意味着我必须手动部署此DLL才能使我的应用程序正常工作。如果它是假的,它实质上意味着“我依赖于另一个必须单独安装或链接的组件,DLL就会在那里”。

答案 1 :(得分:20)

复制本地实际上是为了支持本地调试。当您为应用程序打包和部署时,您应该将项目构建到相同的输出文件夹,并确保您拥有所需的所有引用。

在构建大型源树时,CopyLocal尤其令人痛苦。有关于如何在此处禁用CopyLocal的相关问题,您可以在How do I override CopyLocal (Private) setting for references in .NET from MSBUILD看到它。以及Best practices for large solutions in Visual Studio (2008).

我在文章MSBuild: Best Practices For Creating Reliable Builds, Part 2中写过关于如何处理构建大型源代码树的文章。

所以简而言之,我会说当文件复制导致你的构建花费更多时间然后你愿意为每个构建花费时禁用CopyLocal。

答案 2 :(得分:12)

这真的是关于目标环境。如果copy local为false,则表示程序集已经存在于目标环境中(通常在GAC中)。将其设置为true可确保它显示在构建的输出中,因此可以更轻松地部署到目标环境。

答案 3 :(得分:6)

查看以下MSDN参考资料,详细解释CopyLocal的行为。

Project References

不幸的是,有一些怪癖,并且CopyLocal不必按照预期的方式工作,如下所示构建的辅助装配中的装配参考。

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll(如果在GAC CopyLocal中不会复制到MainApp bin文件夹)

如果您不打算在目标计算机上将第三方程序集安装到GAC中,这会使xcopy部署变得困难。

答案 4 :(得分:2)

此选项仅影响构建阶段。它只是复制对构建程序集的本地目录的引用。

如果另一个程序集(T)想要使用正在构建的程序集中的方法(A),该程序具有来自另一个引用程序集(R)的返回类型或参数,则它(T)应该能够访问该程序集(R) )。如果引用的程序集(R)安装在GAC中,它可能无需执行任何特殊操作即可执行此操作。否则,它需要本地副本。

答案 5 :(得分:0)

设置CopyLocal = false将缩短构建时间,但在部署期间可能会导致不同的问题。

我设置CopyLocal = false的经验不成功。请参阅我的博文“Do NOT Change "Copy Local” project references to false, unless understand subsequences。”

中的赞成和缺点摘要

答案 6 :(得分:0)

设置CopyLocal false的保守方法是检查是否在项目的输出路径中找到了引用。这应该允许你躲避一些讨厌的运行时问题,同时仍然减少IO的数量。

在我创建CopyLocalFixer的过程中,您可以为文件夹运行该过程。我用一个大型版本尝试了这个,但结果并不是那么令人印象深刻。我想这归结为项目的文件夹结构。