Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最终子项目sbt设置_Java_Scala_Build_Sbt - Fatal编程技术网

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
    queue
    中运行所有测试,即使它们没有更改。诚然,您可以“快速测试”,但当您更改git分支等时,这就停止了工作,因此您仍然经常运行整个测试套件
  • 虽然sbt只允许您构建一个子项目,但您必须位于根目录中,并且记住要限定构建。例如,您必须记住运行
    sbt-utils/compile
    ,而不是
    sbt-compile
所以我们转向了完全独立的项目和独立的git回购。每个项目构建并部署一个工件到Nexus。因此,要构建和测试
mainApp
,您只需构建它,它就会从nexus服务器中为其他项目提取已经编译好的.jar文件。这使得只在一个项目中工作变得更容易,但对utils进行更改然后在
mainApp
中使用它就变得更难了。具体地说,您通常希望在
utils
中添加一个方法,然后立即在
mainApp
中测试该方法,以查看它是否有效,然后再推出新版本的
utils
。但现在,要做到这一点,你必须:

  • 将代码添加到utils
  • 在utils中增加版本号
  • 运行“sbt发布loca”
  • mainApp
    中编辑build.sbt,并将
    -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
,然后在那里运行所有(不固定的)命令。