2009-05-01 63 views
6

几个相关型号的应用程序或一个“项目”我定义了一个项目作为一个SVN目录包含树干,树枝,标签子迪尔斯一个大项目颗粒如何是你的SVN“项目”:包含每个应用

什么标准你用确定何时一个项目分成两个或合并几个项目为一个 时 - ?按“项目”一个应用程序与常见的来源,资源共享工程 - 一大“项目”包含所有源和资源对于应用程序?

单个项目或多个项目都有它们的加号和减号。重新走向一个单一的项目,我试图弄清楚这是否是正确的方法。

拆分项目允许更大的能力来控制套件的不同部分如何包含更改。公共库可以是版本,不同的应用程序可以选择使用特定版本(maven dep管理方法)。

拆分项目还创建多个类层次结构使得代码更难以理解作为一个整体,并有可能导致代码重复。我会假设整个结构的正确设计和组件之间的关系对于管理这个成本是非常关键的。

一个统一的项目方式将使其对开发商更容易在建立工作区的条件,并提供一个单一的类层次结构。这是一把双刃剑,因为它也会向开发者投入更多的信息(太多的课程需要理解)。

所以,当你试图决定结合起来,并在那里分裂,你用什么规则拇指?

回答

0

感谢您的意见。我不会“选择”答案,因为我认为他们都有宝贵的观点。避免过早优化似乎很重要,因为暂时保持布局尽可能简单。我们正在转向包含应用程序的单个项目,因为90%的时间我们一起发布ALL。因此,单个应用程序每个项目的复杂性似乎并不合理。即使我们去找maven,一个给定版本的所有maven工件也可能来自同一个分支。如果需要使用SVN历史记录和鱼眼来保持我们的理智,我们可以随时更改它。

我们会重构源布局,就像我们重构源代码一样。当一个项目开始从周长和依赖状况“闻起来不好”时,我们会分解它,但在此之前不会。我可能会在时间上使用周长而不是周长:测试时间&,结账时间。如果我有一个1GB的树,我可以在< 10分钟结帐,并在<中建立/测试30分钟,除非我需要频繁发布部分内容,否则我并不需要分解它。

所以,感谢您的意见。这对我为我的团队和评估选项制定问题非常有帮助。

1

我使用单独的项目,并将它们结合起来,通过svn:externals形成解决方案。

3

SVN Book对这两种方法都有很好的讨论。

最后我会选择任何感觉对存储库用户来说更自然的东西。

就个人而言,我支持一个单一SVN主干/标签/分支机构在里面那些他们自己的文件夹中的所有我的实际代码项目的办法。

然而,对于较大的代码库(我只管理3-4这是一个单一的解决方案的一部分小项目),我会非常考虑改变一个分裂的做法。

4

为了方便维护,我们将与单个应用程序相关的所有项目放在一个SVN Rep中,将应用程序的代码库集中在一个存储库中,还能够管理应用程序的不同资源之间的相互依赖性。

我们通常将我们的资源归入主干内的不同文件夹。该分类主要基于功能/模块化分组或分层分组[DAL,BLL,GUI等]。这完全取决于你如何构建代码。希望这可以帮助。

+0

单一SVN代理的另一个原因是易于维护用户SVN回购权限。 – Vikram 2009-05-01 18:23:09

2

根据项目大小,我使用单独项目和组合项目。对于我们的大型项目,每个项目都位于单独的存储库中,并且具有独立的构建和部署过程。对于我们较小的项目,我们有一个“工具”存储库来包含它们,每个子项目都作为根的子目录。

我还保持着“个人”资源库,人们可以存储他们的测试程序一次性公用事业,或能够从源头控制和集中备份利于其他的事情,但不属于作为一个独立的项目。

1

每个项目独立部署的一个应用程序/模块。如果您发现需要使用Maven -ish依赖管理模块(取决于其他模块的稳定实现),则使用单个项目会导致难以推出发布周期。它也可能导致人们直接使用来自其他应用程序的随机有用代码,而不是将其分解以保留依赖关系图Sane(tm)。

你应该使用合适的测试套件和CI的做法,在明确界定做集成测试,而不是依靠一半的代码失败突然,如果一个部分断裂。

与具有单尤伯杯项目的另一个问题是,它是相当繁重的混帐SVN用户,只有一个单一的模块上工作。

0

为单独的项目保留单独的SVN存储库。你想要的最后一件事是有一个Merge Day

+0

合并日文章更多的是关于愚蠢,而不是将多个项目保存在一个存储库中的弊端。 – 2009-05-01 21:26:57

1

有机增长。迪杰斯特拉曾经说过,预先优化是万恶之源。也要记住YANGI(你不会需要它)。

每个应用程序都会获得自己的带有trunk/tag/branches的文件夹。如果应用程序中的项目变得非常大,那么它会被推送到它自己的单独文件夹,并且可以在构建时链接到应用程序(甚至是svn:externals)。

也就是说,如果你的项目要求开发由10名开发人员编写复杂的应用程序,你看门人或建立主,那么你可以考虑更复杂的替代品。

+0

我不认为预先优化与在高级中计划组织方案相同。 – 2009-05-01 21:20:56

0

有没有“好”这里的答案,但我想应该是含有1个或2个项目SVN回购协议,以及其他含有100之间进行区分。

我维护从VSS迁移而来的SVN回购,它有几百个“项目”,它们中没有一个是沿着trunk/branch/tag结构组织的(事实上,我认为结构实际上是不必要的,在我使用SVN一段时间后没有帮助,当你必须将2个或3个项目标记为单个更改时,它肯定无济于事)。

我们为所有维护的软件维护一个项目目录,在那里我们有配置的子目录和另一个源代码。在那些我们有产品版本号的地方 - 我们非常有效地抛弃了trunk的概念,我们只有标签目录 - 最高的数字是主干(我们必须这样做,因为我们必须同时支持几个版本的项目)。合并根据需要发生,所以如果我更新项目A中的bug 3.0版本;我会将这些更改合并到版本4.0和v5.0。

如果我只做一个或两个项目的回购,我可能会试图保留分支/标签结构,但另一方面 - 我可能会保持目录显式在主树(假设我没有经常发布足够的标签)(我使用版本号作为'标签'顺便说一句,我在那里存储二进制文件,所以如果我需要得到一个特定的旧版本,我可以从看在日志)

它令人惊讶的容易管理,考虑到我有一个10Gb回购与revnum目前已超过300,000有很多旧代码在那里以及更新。我会向其他人推荐该结构,并将再次使用它。

顺便说一句,另一个原因标签目录不会为我们工作是因为我们发布每次有错误或更改请求,无论多么微小。我们的标签目录在一段时间后将无法管理,这就是为什么我们使用revnum作为标签 - 我们可以将它与bug跟踪器相关联,以使其更易于阅读。

所以在粗糙的总结,我们有这样的目录结构,其中V1和V2版本的产品:

maint/source/v1.0/projectA 
maint/source/v1.0/projectB 
maint/source/v2.0/projectA 
maint/source/v2.0/projectB 
etc 

显然,我们可以把在“源”分支dir和分支/标签在每个子项目下,但如果我们需要将2个子项目作为单个更改请求发布(如我们经常这样做),这将变得棘手。将源代码目录下的标签子目录放在源代码目录下意味着我们标记所有内容,当只有一个子项目发生变化时(不符合我们要求分别跟踪每个子项目的要求)