组织多个scala相关的sbt&git项目 – 最佳实践建议
使用
scala,使用sbt进行构建和git进行版本控制,当它成为一个单一项目时,组织团队代码的好方法是什么?在某些时候,您开始考虑将代码分离为单独的库或项目,并根据需要在它们之间导入.你会怎么组织的事情呢?或者你会避免诱惑,只是管理同一个sbt和git单“项目”下的所有软件包?
兴趣点是:(随意改变) >避免发明超出想象的需要的新的“头痛”. 另外,你会使用某种“本地sbt / maven团队资源库”,还有什么可能需要做到这一点?希望这是没有必要的. 谢谢! 解决方法
我在沙中使用以下几行:
>最终在不同部署中的代码在同一个存储库中的不同文件夹中,在一个总体项目下 – 什么SBT称为multi-project build(我使用maven而不是SBT,但概念非常相似).它将被构建/部署到不同的罐子. 在设计有意义的部门时,我会尝试考虑最终的部署.例如,如果我的系统foosys具有foosys-frontend和foosys-backend可部署性,那么foosys-frontend将HTML模板和foosys-backend与数据库进行通信,并且两者通过REST API进行通信,那么我将把它们作为单独的项目,以及用于通用代码的foosys核心项目. foosys-core不允许依赖于html模板库(因为foosys-backend不需要),也不允许在ORM库中(因为foosys-frontend不希望这样做).但是我不用担心将REST库中的代码与“核心域对象”分开,因为foosys-frontend和foosys-backend都使用REST代码. 现在我想添加一个新的foosys-reports可部署,它访问数据库来做一些报告.然后我可能会创建一个foosys-database项目,这取决于foosys-core,以保存foosys-backend和foosys-reports所使用的共享代码.而且由于foosys报告不使用REST库,我也应该从foosys-core中分离出foosys-rest.所以我最终得到一个foosys核心库,另外还有两个依赖它的库项目(foosys-database和foosys-rest)和三个可部署的项目(foosys-报告取决于foosys-database,foosys-frontend取决于foosys -rest和foosys-backend取决于两者). 您会注意到,这意味着可以使用该代码的每个可部署组合的一个代码项目.所有三种可部署的代码都在foosys-core中.该部署项目中只有一个可部署的代码.在三个可部署中的两个中的代码在foosys-rest或foosys-database中.如果我们想要一些代码是foosys-frontend和foosys-reports可部署的一部分,而不是foosys-backend可部署的代码,那么我们必须为该代码创建另一个项目.在理论上,这意味着在我们添加更多可部署项目时,项目数量呈指数级的上升趋势.实际上,我发现这并不是太有问题 – 大多数理论上可能的组合实际上都没有意义,所以只要我们在创建新的项目时,我们实际上有代码就可以了.而如果我们结束了几个foosys核心的课程,这些课程并不是每个可部署的实际使用的,所以并不是世界的末日. 在这种观点中,测试最好被理解为另一种可部署.所以我将有一个单独的foosys测试项目,包含用于所有三个可部署项目(取决于foosys-core)的测试的通用代码,也可能是一个foosys-database-test项目(取决于foosys-test和foosys-database )用于在foosys-backend和foosys-report之间通用的测试助手代码(例如数据库集成测试设置代码).最终我们可能会得到完整的并行层次结构的测试项目. 一旦它们具有不同的发布生命周期,只需将项目移动到单独的git存储库中(并且同时分开整体构建). 不同存储库中的代码必须独立版本化,因此在某种意义上,这是一个空虚的定义.但是我认为只有当你必须(只有使用this post:你应该只使用Hadoop,当你的数据太大,不能使用任何更友好的东西)时,你应该继续分开git仓库.一旦您的代码在多个git存储库中,您必须手动更新它们之间的依赖关系(在一台可以使用-SNAPSHOT依赖关系和IDE支持的开发机器上工作,就像这些版本仍然保持同步,但是您必须手动更新每次你与主人重新同步,所以它增加了开发的摩擦力).由于您正在发布和异步更新依赖关系,您必须采用并执行类似语义版本控制的操作,以便人们知道何时可以更新对foocorp-utils的依赖关系以及何时不更新.您必须发布更改日志,并具有早期警告的CI构建和更彻底的代码审查过程.所有这一切是因为反馈周期要长得多;如果你在一个下游项目中打破某些东西,直到他们更新对foocorp-utils的依赖,几个月甚至几年后才会知道这一点(是的,几年 – 我见证了这一点,而在80个人的启动中,一个megacorp).所以你需要防止这种情况的过程,一切都变得相对较少敏捷. 有效的理由包括: >您的项目的完整构建需要太长时间,减慢您正在开发的代码的集成 – 尽管尝试加快速度. 我会使用一个团队maven仓库,大概是Nexus.实际上,我会推荐这个甚至在你进入多项目阶段之前.它很容易运行(只是一个Java应用程序),您可以通过它proxy your external dependencies,这意味着您有一个可靠的依赖项的源,即使您的上游依赖关系消失,您的构建也将重现. 我打算写出我的团队工作方式作为一个博客文章,但在此期间,我很乐意回答任何其他问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |