【问题标题】:How to structure a VCS with multiple dependent projects如何构建具有多个依赖项目的 VCS
【发布时间】:2009-05-26 03:43:38
【问题描述】:

我确信这是其他人以前解决过的常见问题,因此我呼吁其他开发人员/项目经理的集体智慧寻求帮助。

我有很多项目:

  • 应用
  • Web 应用程序
  • 服务器应用程序
  • 开发实用程序
  • ORM

所有应用程序/实用程序都依赖于 ORM:当 ORM 更改时,需要对其进行编译,并且所有应用程序都需要针对它重新编译然后部署。现在我的 VCS 结构有点混乱:

  • 应用名称
    • 后备箱
      • 应用
      • Web 应用程序
      • 服务器应用程序
      • Dev Utils(目前大约 4 个文件夹,但还在增加)
      • ORM
    • 释放
      • 项目名称(无论是应用程序还是 WebApp)版本号
    • 分支机构
      • ExperimentName_DevName

理想情况下,我希望每个应用程序(Application/WebApp/ORM 等)都有一个根文件夹,每个应用程序都有自己的 Trunk/Branches/Releases 等,以在逻辑上和物理上将它们分开。我的理由是,由于在应用程序上完成了大量工作,并且它被更频繁地发布,每个发布分支都有相同实用程序的相同副本等。此外,检查主干以处理它总是意味着所有其他项目随之而来。

但是,分离意味着将某些项目从解决方案中剥离出来,同时修改任何项目是一件痛苦的事情——在 2-3 个 IDE 之间切换(尤其是在更改 ORM 时)。

我正在考虑这个问题,因为我很快就会组装一台 CI 机器(在一周左右的时间里准备好回答有关这方面的问题)并且我正在尝试找出一种方法来自动创建发布/部署。通常,只有应用程序被部署,通过脚本复制到所有工作站在启动时从中拉出的服务器,但就像我之前所说的,如果 ORM 更改/发布,所有其他应用程序都应该重新构建和部署。

(今天我破坏了我们的网站和 3 个实用程序,因为我更改了 ORM 并使用更新版本的应用程序部署它,但忘记使用新的 ORM 重建/部署其他应用程序 - 哎呀。)

【问题讨论】:

  • 你的IDE可以同时加载多组项目吗?例如,Eclipse 的工作集对此有很大帮助。另外,每个模块的更改频率如何?
  • 关于 CI,您可以在此处查看/搜索 TeamCity、Electric Can 和 CruiseControl,看看其他人做了什么。
  • 1) 我以前没有以这种方式使用过 Visual Studio。每个解决方案可以有多个项目(目前 Application 和 ORM 是同一个解决方案中的 2 个项目。不过我不确定是否有多个解决方案。2)经过深思熟虑和研究,我决定使用 TeamCity 或 Hudson 作为 CI服务器(倾向于前者)
  • 另外:应用程序几乎每天都在变化,并带有一些小功能。 ORM 可能每周更改一次,我创建/使用的 1 个实用程序每周更改一次或两次,而其他大多数实用程序在过去 6 个月中可能更改一次或两次(并且在 ORM 更改时才重新构建)
  • 我肯定会拆分你的 CI,这样每个功能块都是独立的,如果依赖于它的任何东西发生变化,就会被触发。

标签: version-control continuous-integration


【解决方案1】:

设身处地为您的开发人员着想。这应该不难,因为听起来您就是其中之一 :-) 不是从架构的角度,而是从可用性的角度来看您的版本控制布局。问问自己:作为开发人员,我们每天对源代码做的最常见的事情是什么?具体考虑您与 VCS 系统和项目布局的交互。你想让普通的事情变得简单。不太常见的用例更难找到是可以的,只要你有如何做的记录,这样当(不是如果!)人们忘记时,他们就会知道去哪里提醒自己如何做.

我看到很多 VCS 布局都试图在架构上“完美”,但从日常使用的角度来看,最终导致的麻烦和头痛没有尽头。我并不是说两者不能重合,不能很好地融合在一起,我只是说从用户的角度考虑,并以此为指导。

从 CI 的角度来看,我仍然会采用这种方法。即使您的设置最终在您选择的 CI 中定义变得更加复杂,您也只需在那里进行一次设置。如果布局在开发过程中易于使用,那么您的大部分 CI 设置也应该相对容易。然后,您只需专注于需要更多时间的最后一点。

【讨论】:

    【解决方案2】:

    将您的代码库拆分为不同的“项目”可能非常困难。我们在每个单独的“可部署”边界上都这样做了。包括一个其他人共同/使用的“平台”层,作为一个单独的项目。但这也不是很完美。

    我不能强调的一件事是,需要在签入之后和实际部署任何东西之前运行某种形式的连续回归/测试。此外,甚至可能涉及一些手动测试的“释放”过程可能会有所帮助,并且肯定可以防止一些鸡蛋在脸上的情况。 (最好晚几天发布,然后坏掉。)

    (抱歉没有直接解决您的问题)

    【讨论】:

    • +1 - 这是一个很好的建议。我应该注意到,每个应用程序(甚至是 ORM)都有自己的测试项目,其中包含该项目的所有单元/集成测试(但是它们可能很稀疏......当我得到它时代码库为零;我在我去创建它们的过程),它确实在任何版本(手动)之前运行,但它们通常只测试每个项目中的特定模块。迁移到 CI 的一部分是自动执行每次签入和计划构建时运行的手动测试。
    • 采用别人的“未经测试”的代码不是很有趣吗?进行一两次高水平的“踢车轮”型式测试可能是值得的。当他们一起工作而不是单独工作时,他们只会击中大部分部分。
    猜你喜欢
    • 2013-05-11
    • 2016-08-11
    • 2011-10-18
    • 2012-12-04
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多