首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >积累子项目“发现的Accumulate”

积累子项目“发现的Accumulate”
EN

Stack Overflow用户
提问于 2017-08-21 13:41:22
回答 2查看 592关注 0票数 2

如何在SBT中积累项目的所有discoveredMainClasses及其依赖的子项目?

例如,我有一个项目,看起来

代码语言:javascript
复制
├── bar
│   └── src
│       └── main
│           └── scala
│               └── BarMain.scala
├── build.sbt
├── foo
│   └── src
│       └── main
│           └── scala
│               └── FooMain.scala
├── project
│   └── build.properties
└── root

使用一个root项目aggregate(foo, bar),我得到了discoveredMainClasses的以下内容

代码语言:javascript
复制
[info] foo/compile:discoveredMainClasses
[info]  List(MainFoo)
[info] bar/compile:discoveredMainClasses
[info]  List(MainBar)
[info] root/compile:discoveredMainClasses
[info]  List()

只有一个root我能得到dependsOn(foo, bar)

代码语言:javascript
复制
> show discoveredMainClasses
[info] *  

如何使show root/discoveredMainClasses同时包含MainFooMainBar

对于上下文,我还有其他依赖于discoveredMainClasses输出的任务,即土制包装机中的makeBashScripts

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-27 11:03:08

其核心思想是创建一个依赖于您希望包含和配置该模块上所有设置的所有子模块的模块。

这会导致像这样的build.sbt

代码语言:javascript
复制
lazy val root = project.in(file("."))
  // package the root module, but not the sub modules
  .enablePlugins(JavaAppPackaging)
  .settings(
    name := "application",
    // add the discoveredMainClasses to this project
    discoveredMainClasses in Compile ++= (discoveredMainClasses in (client, Compile)).value,
    discoveredMainClasses in Compile ++= (discoveredMainClasses in (server, Compile)).value
  )
  // include these modules in the resulting package
  .dependsOn(client, server)

lazy val client = project.in(file("client"))
  .settings(
    name := "client"
  )

lazy val server = project.in(file("server"))
  .settings(
    name := "server"
  )

(discoveredMainClasses in (client, Compile)).value从编译范围内的客户端项目访问discoveredMainClasses。

可以使用以下方法构建和运行应用程序

代码语言:javascript
复制
$ sbt universal:stage
$ ./target/universal/stage/bin/client-app
$ ./target/universal/stage/bin/server-app

一个在这里可以找到正在运行的示例

干杯,穆基

票数 2
EN

Stack Overflow用户

发布于 2017-12-20 19:19:18

@Muki回答的另一种方法是定义一个ScopeFilter,它包含除root之外的所有内容,并以这种方式积累主类。这样做的好处是不必在任何地方重复clientserver

生成的build.sbt

代码语言:javascript
复制
lazy val allCompileButRootFilter = 
  ScopeFilter(inAggregates(ThisProject, includeRoot = false), inConfigurations(Compile))

lazy val root = project.in(file("."))
  .aggregate(client, server)
  .enablePlugins(JavaAppPackaging)
  .settings(
    discoveredMainClasses in Compile ++= 
      discoveredMainClasses.all(allCompileButRootFilter).value.flatten,
    ...
  )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45798645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档