我正在处理一些代码,这些代码包含多个子项目,其中许多子项目彼此依赖。例如,有一个utils
项目,包含各种实用程序,一个queueing
项目,其中包含一些用于管理事物队列的代码,然后是mainApp
项目。 queueing
项目取决于utils
,mainApp
取决于utils
和queueing
。此外还有更多的项目,但希望你能得到一般的想法。
我们使用一个标准的sbt子模块设置,包含一个根构建文件,许多子项目以及标准的aggregate
和dependsOn
内容。这有效,但有问题:
mainApp
导致utils
和queuing
中的所有测试都运行,即使它们没有发生变化。没错,你可以快速测试"但是当你改变git分支时它会停止工作,所以你仍然经常运行整个测试套件。sbt utils/compile
而不是sbt compile
。所以我们切换到完全独立的项目和单独的git repos。每个项目都会构建,然后将工件部署到Nexus。因此,要构建和测试mainApp
,您只需构建它,它就会从nexus服务器中为其他项目提取已编译的.jar文件。这使得在一个项目中工作变得更容易,但是对例如utils进行更改变得更加困难,然后在mainApp
中使用它。具体来说,您经常需要做一些事情,例如向utils
添加方法,然后立即在mainApp
中测试该方法,以便在推送新版utils
之前查看它是否有效。但是现在,要做到这一点,你必须:
mainApp
中修改build.sbt并将-SNAPSHOT
添加到utils
依赖关系sbt update
mainApp
如果一切正常,那么您必须按正确的顺序将utils
和mainApp
推送到持续构建服务器,并确保在您之前等待utils
构建完成推mainApp
。
更糟糕的是,维护版本控制变得非常复杂。假设我们从版本1.0的所有项目开始,并取决于其他项目的1.0版本。现在假设我们在utils
中发现了一个影响mainApp
的错误。因此我们修复utils
,将其版本号更改为1.1,更新mainApp
以依赖于1.1并重新构建。假设修复mainApp
中的错误的代码在queue
中引入了一个错误。问题是,如果你去queue
并运行它的测试,它们将对utils
的版本1.0运行(即使你使用范围作为sbt只是定期重新检查它们)。但是,当您构建mainApp
时,utils
上将存在依赖冲突,sbt将解析该冲突。无论它如何解决它,它都将是错误的"至少一个项目。我们可以将解析器设置为" strict"但是,在10多个项目中,管理版本变得非常耗费人力。
我真正想要的是一个两全其美的构建设置。具体做法是:
pwd
是其中一个子目录,则所有sbt命令仅指该项目。因此,如果pwd
为queue
,则sbt test
仅编译并测试 queue
。或类似的东西。有没有人对如何用sbt进行设置提出任何建议?