如何仅对默认的根项目禁用AssemblyPlugin?

时间:2018-07-26 04:30:11

标签: sbt

说我具有以下多项目结构:

my-project/
├── build.sbt
├── app1/
├── app2/
├── app3/
├── sharedA/
└── sharedB/

我使用sbt-assembly app 子项目创建胖的JAR。 shared 子项目只是库代码,因此我禁用了 AssemblyPlugin

我使用default root project语法,因此子项目得以汇总,而无需我全部列出。

name := "my-project"

lazy val app1 = (project in file("app1"))
  .dependsOn(sharedA)

lazy val app2 = (project in file("app2"))
  .dependsOn(sharedB)

lazy val app3 = (project in file("app3"))
  .dependsOn(sharedA, sharedB)

lazy val sharedA = (project in file("sharedA"))
  .disablePlugins(AssemblyPlugin)

lazy val sharedB = (project in file("sharedB"))
  .disablePlugins(AssemblyPlugin)

当我运行sbt assembly时,这通常可以正常工作:我得到了 app 的程序集jar,而没有了 shared 的程序集jar。但是,我也得到了一个不需要的 my-project-assembly.jar 。如何禁用此功能?

如果我从顶部禁用

name := "my-project"
disablePlugins(AssemblyPlugin)

...

然后,即使对于子项目,该插件也被完全禁用。

我知道我可以显式声明一个根项目,并且可行:

lazy val root = (project in file("."))
  .aggregate(app1, app2, app3, sharedA, sharedB)
  .disablePlugins(AssemblyPlugin)

...

但是,实际上,可能会有很多子项目,因此我想坚持使用默认根项目样式。

1 个答案:

答案 0 :(得分:0)

如果您丢弃assemblyMergeStrategy中的路径,我认为它将按照您的意愿运行。

assemblyMergeStrategy in assembly := { 

    case PathList("sharedA", xs @ _*) => MergeStrategy.discard
    case PathList("sharedB", xs @ _*) => MergeStrategy.discard
    ...

}