你的SVN“项目”:一个包含多个相关应用程序或每个应用程序的一个“项目”的大项目

StackOverflow https://stackoverflow.com/questions/812497

  •  03-07-2019
  •  | 
  •  

我将项目定义为包含trunk,branches,tags sub dirs的SVN目录。

在确定何时将项目拆分为两个项目或将多个项目合并为一个项目时,您使用什么标准? - 每个“项目”一个应用程序共享源和资源共享项目? - 一个大的“项目”包含应用程序的所有源和资源?

单个项目或多个项目都有其优缺点。我们正朝着一个单一的项目前进,我正在试图弄清楚这是否是正确的方法。

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

拆分项目还会创建多个类层次结构,从而使代码整体难以理解,并可能导致代码重复。我认为整体结构的正确设计和组件之间的关系对于管理这个成本至关重要。

统一的项目方法将使开发人员在设置工作区方面更容易,并提供单个类层次结构。这是一把双刃剑,因为它还会向开发人员提供更多信息(太多的课程无法理解)。

那么,当你试图决定在哪里合并以及在哪里拆分时,你会使用什么经验法则?

有帮助吗?

解决方案 9

感谢您的投入。我不会“选择”答案是因为我认为所有这些都有重要意义。避免过早优化似乎是关键,因为暂时保持布局尽可能简单。我们正在转向包含应用程序的单个项目,因为90%的时间我们一起发布ALL。因此,使用每个项目的一个应用程序复杂化事情似乎没有意义。即使我们去maven,给定版本的所有maven工件都可能来自同一个分支。如果需要使用SVN历史和鱼眼来保持我们的理智,我们可以随时更改它。

我们将重构源布局,就像我们重构源代码一样。当一个项目开始“闻起来不好”时从周长和依赖情况来看,我们会分手,但不是在此之前。我可能会及时使用周长而不是太空周长:建造时间和时间测试,结账时间。如果我有一个1GB的树,我可以在< 10分钟并在<中构建/测试30分钟我不需要打破它,除非我被要求经常发布部分内容。

所以,谢谢你的意见。在为我的团队和评估选项构建问题时,这确实很有帮助。

其他提示

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

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

SVN Book 对这两种方法进行了很好的讨论。

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

就个人而言,我赞成使用单个SVN主干/标记/分支方法,将所有实际代码项目放在其自己的文件夹中。

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

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

我还保持“个人”状态。存储库,人们可以存储他们的测试程序一次性实用程序,或其他可以从源代码控制和集中备份中受益的东西,但不属于独立项目。

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

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

您应该使用明确定义的适当测试套件和CI实践进行集成测试,而不是依靠一半代码在一个部件发生故障时突然失败。

拥有一个超级项目的另一个问题是,对于仅在单个模块上工作的git-svn用户而言,这是相当繁重的。

有机增长。 Dijkstra曾经说过,预先优化是所有邪恶的根源。还要记住YANGI(你不需要它)。

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

也就是说,如果您的项目要求是开发由10位开发人员编写的复杂应用程序,并且您是守门人或构建主人,那么您可以考虑更复杂的替代方案。

为单独的项目保留单独的SVN存储库。你想要的最后一件事是合并日

这里没有“好”的答案,但我认为应该区分包含1或2个项目的SVN repos和包含100个项目的其他项目。

我维护一个从VSS迁移的SVN repo,它有几百个“项目”。在它中,它们都没有沿着主干/分支/标签结构组织(实际上我认为在我使用SVN一段时间之后这种结构真的是不必要和无益的,当你必须标记时它肯定没有帮助2或3个项目作为单一变更)。

我们为所有维护的软件维护一个项目目录,在该目录下我们有用于配置的子目录和用于源的另一个子目录。在那些我们有产品版本号的情况下 - 所以我们有效地抛弃了trunk的概念,我们只有标签目录 - 最高的数字是主干(我们必须这样做,因为我们必须同时支持多个版本的项目)。根据需要进行合并,因此如果我更新项目A中的错误,版本3.0;我将这些更改合并到版本4.0和v5.0。

如果我只用1或2个项目进行回购,我可能会想要保留分支/标记结构,但另一方面 - 我可能会在主树中保持目录显式(假设我没有经常发布以定期标记)(我使用修订号作为'标签'BTW,我在那里存储二进制文件。所以如果我需要获得一个特定的旧版本,我可以从中查找正确的二进制文件日志)

考虑到我有一个10Gb的回购,目前有超过300,000的revnum,其中包含大量旧代码以及更新版本,因此其出人意料地易于管理。我会向其他人推荐这个结构,并会再次使用它。

顺便提一下,标签dir对我们不起作用的另一个原因是因为我们每次有错误或更改请求时都会释放,无论多么微小。我们的标签目录在一段时间后将无法管理,这就是为什么我们将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
显然,我们可以在'source'下放置一个分支目录,在每个子项目下也有一个分支/标签,但如果我们需要将2个子项目作为单个变更请求发布(我们经常这样做),那将会变得棘手。在源目录下放置一个标记子目录意味着我们标记所有内容,只有一个子项目被更改(不符合我们单独跟踪每个子项目的要求)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top