Sbt 如何仅为默认根项目禁用AssemblyPlugin?

Sbt 如何仅为默认根项目禁用AssemblyPlugin?,sbt,Sbt,假设我有以下多项目结构: my-project/ ├── build.sbt ├── app1/ ├── app2/ ├── app3/ ├── sharedA/ └── sharedB/ 我用于为应用程序子项目创建胖jar。共享的子项目只是库代码,所以我禁用了AssemblyPlugin 我使用这种语法,这样子项目就可以聚合,而不必全部列出 name := "my-project" lazy val app1 = (project in file("app1")) .dependsOn

假设我有以下多项目结构:

my-project/
├── build.sbt
├── app1/
├── app2/
├── app3/
├── sharedA/
└── sharedB/
我用于为应用程序子项目创建胖jar。共享的子项目只是库代码,所以我禁用了AssemblyPlugin

我使用这种语法,这样子项目就可以聚合,而不必全部列出

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
时,这主要是有效的:我为应用程序获取汇编jar,而为共享项获取一个。然而,我也得到了一个我不需要的我的projectassembly.jar。如何禁用此功能

如果我从顶部禁用

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

...
然后该插件被完全禁用,即使对于子项目也是如此

我知道我可以显式地声明根项目,这是可行的:

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

...

但是,实际上,可能有很多子项目,因此我希望坚持默认的根项目样式。

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

assemblyMergeStrategy in assembly := { 

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

}