你如何将 sbt 项目组合成一个单独的构建?

Posted

技术标签:

【中文标题】你如何将 sbt 项目组合成一个单独的构建?【英文标题】:How do you compose sbt projects into a single build? 【发布时间】:2016-04-02 21:08:09 【问题描述】:

关于编写 sbt 项目的问题: 我分叉了一个库项目 (https://github.com/allenai/pipeline),并希望针对使用它的项目来破解它。如果我将它们放在同一个多项目构建中——实际上我更喜欢在本地发布和消费——sbt 将不会读取嵌套 fork 的 project 目录(.scala 文件和插件定义最初所在的位置)。 例如。我尝试,在 build.sbt 中:

lazy val pipeline = (project in file("pipeline"))

lazy val githubCruncher = (project in file("."))
  .dependsOn(pipeline)

我收到错误指示目录pipeline/project 被忽略;嵌套项目的build.sbt 本身正在被读取,但sbt 没有在其兄弟project 目录中找到与其旁边定义的内容(因此无法加载构建定义)。

那么,我必须将这两个项目压缩成一个 build.sbt 还是我可以以某种方式优雅地组合这两个项目?我之所以这么问,是因为这也是我从事的其他项目的一个问题,我最终将每个构建定义细节压缩成一个大单体——尽管我更愿意将一些子项目作为独立项目分发,而不是我的自己的开发配置。

【问题讨论】:

【参考方案1】:

根据我的经验,项目的 project 目录中的所有内容似乎都被拉入多项目构建 - 需要移动到多项目的 root 下的 project构建,而引入的项目的build.sbt 不必被压扁——从顶层build.sbt 对其的引用将起作用(除非该引用后面跟着它的定义在顶层build.sbt)。

来自拉入项目的 Sbt 插件随后将应用于统一的多项目构建,并且需要在适当或需要的情况下使用 disablePlugins 禁用其他子项目。

【讨论】:

下次也可以考虑storm-enroute.com/mecha,或者不太具体的场景local external projects workflow

以上是关于你如何将 sbt 项目组合成一个单独的构建?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将 sbt-plugin 用作多项目构建中的依赖项来访问它的子项目?

你如何在 sbt 中编写任务?

使用 sbt 进行多项目构建

如何从特定项目的交叉构建的sbt多项目中删除scala版本

构建 maven 项目作为 SBT 构建的一部分

SBT将项目ID添加到多项目构建中的日志中