SVN布局 -- 最佳实践

6
在CVS中,我们有一个包含多个目录的项目。有一个每夜构建的过程,需要从同一CVS项目中的不同目录中获取内容以构建每夜构建版本。因此,如果我们转移到SVN,我必须考虑到这一点,并修改构建脚本以从不同的存储库中检出内容。

我已经阅读了相关的SVN QA,但我有自己的问题需要回答。
我可以这样做:
/trunk
/tags
/branches
/3rdparty

我们开发的所有内容都来自于 /trunk,任何未更改的第三方内容都会放在 /3rdparty 中。
现在一切都很好,但是每晚的构建脚本必须标记 trunk,并检出标记,将所需的第三方内容检出到正确的目录中,然后开始构建过程。
构建结果(编译的内容)可以保留在 NFS 挂载上一段时间,以便集成团队可以返回 2 周并重新创建问题。
我是否已经涵盖了所有方面?
5个回答

9

SVN红皮书 这里 包含了很多关于不同项目类型的布局和如何管理它们的信息。

您也可以使用hooks/触发器/外部资源来从名为“第三方”的独立仓库中拉取数据。因此,当开发人员检出一个仓库时,他也会得到第三方库。有很多方法可以分离关注点,但同时呈现统一的仓库组件。

祝好运!


我可能在书中看到了有关发布分支的一些内容,如果你能指出它确切的位置,那将是一个很好的帮助。谢谢。 - pal4life

2
可能值得使用一个构建引擎,如hudson或cruise control。 工作流程略有不同 - 标签是在构建之后创建的,但你可以获得额外的模块,使你对此有一些控制。 重点是,所有的开发工作都为你完成了,你得到了一个不错的框架来进行夜间构建,并且你还得到了一个漂亮的 Web 界面来控制和监视一切。
个人而言,我会在主干上放置一些外部定义,以将适当的第三方库拉入适当的位置。这样,当你更改第三方库版本时,你只需在主干上进行修改,而不必修改构建脚本。 这也意味着你可以通过检出相应的主干/标签/分支来构建旧版本。请注意 - 只在主干上进行它们,散布它们可能会导致麻烦。
我还会将仓库分层,例如:
project
 /trunk
 /branches
 /tags
3rdparty

仅仅因为这样可以让你在某个时候增加更多顶级项目。这样做可以完全独立地管理不同的项目 - 如果存在依赖关系,你仍然可以使用外部引用将正确的版本从一个项目引用到另一个项目 - 这样可以很好地防止一个项目的更改默默地破坏/更改了依赖项目。
使用单独的存储库也可以实现这一点,这也是可以的,但在这种情况下,我会从一开始就将第三方部分分离到一个单独的存储库中。

1
为什么不把第三方移入主干?每当你分支时,第三方的副本都会进入分支。显然,你不会在分支中更改第三方的内容,因为你的分支是基于现有的第三方内容编码的。
我不太确定你所说的标记是什么意思。你是指版本号吗?如果是版本号,请通过脚本传递并标记构建。

3
第三方库在主干分支?不要这样做,这会导致混乱。第三方库基本上是从红皮书中的供应商分支出来的,将它们保持分离是我的选择。 - Jim T

1
如果“多个目录”是您想要独立版本控制的单独组件,则应将每个组件放在自己的存储库中,以便可以单独标记它们。但是,如果这是一个单独的自包含项目(即,如果您通常会一起标记和分支所有组件),则可以将所有代码放在同一个存储库中。
您应该考虑使用外部资源来处理第三方工件。

0
我的脚本检出主干,修改文件(调整AssemblyInfo.cs文件中的版本号等),然后进行标记。如果您不需要以任何方式修改文件,则首先进行标记也是可以的。
除此之外,至少对我来说,您的设置听起来不错。

在你的基础文件夹之外引用第三方库并不是一个好主意。我会在trunk\lib下创建一个文件夹,并把所有第三方库放在那里。这样你就可以避免引用基础文件夹之外的内容。IMGLO - Broken Link
你把你的脚本发布在哪里了,这样我就可以看一下了吗?谢谢。 - Avid Coder
这是一个FinalBuilder脚本,给我发一封电子邮件(地址在个人资料中),我会发送给您一份副本。但是,除非您正在使用FinalBuilder,否则它可能对您没有太大帮助。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接