Java 最终子项目sbt设置
我正在编写一些代码和几个子项目,其中许多子项目相互依赖。例如,有一个包含各种实用程序的Java 最终子项目sbt设置,java,scala,build,sbt,Java,Scala,Build,Sbt,我正在编写一些代码和几个子项目,其中许多子项目相互依赖。例如,有一个包含各种实用程序的utils项目,一个包含一些用于管理事物队列的代码的queue项目,然后是一个mainApp项目。排队项目依赖于utils,mainApp依赖于utils和排队。除此之外,还有很多项目,但希望你能大致了解一下 我们过去对此有一个标准的sbt子模块设置,包括一个根构建文件、许多子项目和标准的aggregate和dependsOn内容。这是可行的,但有问题: 为项目构建和运行测试可能会非常缓慢。构建每一个过程大约
utils
项目,一个包含一些用于管理事物队列的代码的queue
项目,然后是一个mainApp
项目。排队
项目依赖于utils
,mainApp
依赖于utils
和排队
。除此之外,还有很多项目,但希望你能大致了解一下
我们过去对此有一个标准的sbt子模块设置,包括一个根构建文件、许多子项目和标准的aggregate
和dependsOn
内容。这是可行的,但有问题:
- 为项目构建和运行测试可能会非常缓慢。构建每一个过程大约需要15分钟,而单元测试则需要更长的时间
- 由于聚合的工作方式,单元测试
导致在mainApp
和utils
中运行所有测试,即使它们没有更改。诚然,您可以“快速测试”,但当您更改git分支等时,这就停止了工作,因此您仍然经常运行整个测试套件queue
- 虽然sbt只允许您构建一个子项目,但您必须位于根目录中,并且记住要限定构建。例如,您必须记住运行
,而不是sbt-utils/compile
sbt-compile
mainApp
,您只需构建它,它就会从nexus服务器中为其他项目提取已经编译好的.jar文件。这使得只在一个项目中工作变得更容易,但对utils进行更改然后在mainApp
中使用它就变得更难了。具体地说,您通常希望在utils
中添加一个方法,然后立即在mainApp
中测试该方法,以查看它是否有效,然后再推出新版本的utils
。但现在,要做到这一点,你必须:
- 将代码添加到utils
- 在utils中增加版本号
- 运行“sbt发布loca”
- 在
中编辑build.sbt,并将mainApp
添加到-SNAPSHOT
依赖项中utils
- 运行
sbt更新
- 构建和测试
mainApp
utils
和mainApp
推送到持续构建服务器,并确保在推送mainApp
之前等待utils
构建完成
更糟糕的是,维护版本控制变得非常复杂。假设我们从版本1.0的所有项目开始,并取决于其他项目的版本1.0。现在假设我们在utils
中发现一个影响mainApp
的bug。因此,我们修复了utils
,将其版本号更改为1.1,更新mainApp
以依赖于1.1并重新构建。假设在mainApp
中修复错误的代码在队列中引入错误。问题是,如果您转到队列
并运行其测试,它们将针对utils的1.0版运行(即使您使用范围作为sbt,也只是定期重新检查这些范围)。但是,当您构建mainApp
时,sbt将解决的utils
上会存在依赖冲突。不管它如何解决,至少有一个项目是“错误的”。我们可以将解析器设置为“严格”,但是在10多个项目中,管理版本变得非常费力
我真正想要的是一个两全其美的构建设置。具体而言:
- 我有一个根目录和每个项目的子目录
- 如果
pwd
是这些子目录之一,则所有sbt命令仅引用该项目。因此,如果pwd
是queue
,那么sbt test
只编译和测试queue
- 如果Nexus中有一个工件的版本,它将从那里被提取出来,但是如果磁盘上有更新的代码,则依赖关系将在本地构建并使用
或者类似的。有人对如何使用sbt进行设置有什么建议吗?关于“您必须记住运行sbt utils/compile
而不是sbt compile
”,您可以打开sbt
命令行,键入project utils
,然后在那里运行所有(不固定的)命令。