如何处理.NET中发布的常用库?

时间:2012-02-28 10:44:06

标签: c# .net reference svn-externals

这是SVN结构:

/trunk
    + ProjectA
    + ProjectB
    + Common
        + ProjectCore
        + References

ProjectAProjectB将提供最终产品,每个产品都有自己的发布生命周期。两个项目都使用ProjectCore中的相同公共库。 ProjectCore也将拥有自己的发布生命周期。 在ProjectAProjectB中,我们想要引用ProjectCore的库。在ProjectCore的成功发布生命周期后,ProjectCore-libs被添加到SVN。 ProjectCore-libs已添加到References文件夹中。

通过这样做,我们释放(冻结)我们的ProjectCore版本,作为一个经过全面测试的组件。所以我们有多个Core-lib版本:

  • RLS_Core_1.00
  • RLS_Core_1.01
  • RLS_Core_2.00
  • RLS_Core_3.00

由于我们将已发布的库(dll)添加到SVN,ProjectAProjectB可以引用它们。 这样做的最佳方法是什么?

方法1

ProjectCore - libs添加到名为References的{​​{1}}下的新文件夹中的SVN。

RLS_Core_X_XXProjectA的解决方案中,我们添加了对此唯一文件夹的引用:ProjectB

方法2

./trunk/Common/References/RLS_Core_X_XX - libs添加到SVN下的同一个文件夹ProjectCore下。如果其中有一个“旧”版本,它将是一个提交。

References/CoreProjectA的解决方案中,我们添加了对ProjectB的引用。我们使用SVN外部属性来定义Core {libs的哪个版本必须用于./trunk/Common/References/CoreProjectA

在这两种方法中,开发人员明确地需要决定他想要在他的项目中使用哪些Core-libs。除非由于缺少功能而必须升级,否则该规则将保留相同的Core-libs。 方法1 :在项目解决方案中编辑。 方法2 :在外部属性中进行编辑。

首选哪种方法?

4 个答案:

答案 0 :(得分:1)

首先看起来很自然的是为每个项目使用推荐的文件夹结构(branchestagstrunk)文件夹单独。这也适用于通用项目,特别是如果您要使用这两个最终产品引用的版本。由于这些项目将分开开发,您应该能够创建单独的标签和分支。

完成此操作后,(并且由于您需要将所有引用包含在构建的程序集中),最好将已发布的程序集分别复制到每个项目Reference子文件夹中。

这样,无论何时创建分支,您都拥有所需版本的确切快照,并且它独立于常见的开发。

换句话说:

/RepoRoot
    + ProjectA
        + branches
        + tags
            + v1.0
            + v1.1
        + trunk
            + references (includes 3rd-party and ProjectCore)
    + ProjectB
        + branches
        + tags
            + v0.8
            + v1.2
        + trunk
            + references
    + ProjectCore
        + branches
        + tags
            + v2.0
            + v2.1
        + trunk
            + references

答案 1 :(得分:0)

我喜欢方法1,因为它应该更快更容易在不同版本之间切换

答案 2 :(得分:0)

两种解决方案都非常相同,因此您需要立即考虑部署。假设您在.NET程序集上启用了版本控制,则在部署应用程序时必须释放正确的库。

所以,我会明确表示 - 解决方案1 ​​ - 引用其中包含lib版本名称的目录,并且不要尝试“重用”相同的引用目录。那么你就会知道要传递哪些dll,你就不会错。 (如果你在没有'use externals'选项的情况下更新你的项目,你可以做到这一点,有些人这样做。在.NET中,如果你不小心重建了'错'的dll,你将最终进入一个参考地狱的世界)。

缺点是您需要在更新时更新项目引用,但如果在项目文件中搜索+替换,这不是太大的问题。

答案 3 :(得分:0)

正如其他人已经说过的一切都完全一样,只需记录好。但我建议将ProjectCore的版本不作为trunk文件夹的子文件夹版本。相反,我会为每个版本创建分支,以便您在ProjectCore下获得如下结构:

/RepoRoot
   + ProjectCore
   + trunk
       + ProjectCore
   + branches
       + RLS_Core_1_00
       + RLS_Core_1_01
       + RLS_Core_2_00
   + ProjectA
       + trunk
           + ProjectA
       + branches
           + ProjectA_3_57
           + ProjectA_3_78

如果使用ProjectA下面的外部文件夹链接到ProjectCore的特定分支,或者如果更改.csproj文件中的参考路径,在ProjectA文件夹的外部,则将ProjectA内链接到ProjectCore结构(上面一层)只是一个品味问题。

我希望这个答案取决于开发人员对subversion外部属性的特性的熟悉程度。如果他们中的大多数人不知道这个或它究竟是如何工作的,它会使他们感到困惑并导致错误。在这种情况下,通过将路径放入.csproj文件来采取直接方法。如果每个开发人员都知道并使用外部,那就拿这个。