【问题标题】:SBT assembly skip some subprojectsSBT 汇编跳过一些子项目
【发布时间】:2015-03-18 13:05:53
【问题描述】:

我有一个为 sbt 程序集配置的 sbt 多模块项目。在这个项目中,我想跳过不打算执行的子项目的胖 jar 生成,以加快构建速度。但我不确定这是怎么做到的。

【问题讨论】:

    标签: sbt


    【解决方案1】:

    如果您使用 build.sbt 文件,您可以禁用模块的程序集插件,如下所示:

    lazy val module = (project in file("module"))
      .disablePlugins(sbtassembly.AssemblyPlugin)
      .settings(
        ...
      )
    
    

    这也适用于根模块:

    lazy val `project-name` = (project in file("."))
      .disablePlugins(sbtassembly.AssemblyPlugin)
      .aggregate(`module-1`, `module-2`)
      .settings(
        ...
      )
    

    (感谢@tobym 在另​​一个答案中的评论找到答案。)

    【讨论】:

      【解决方案2】:

      只是不要在不需要的子模块中包含程序集设置。

      例如,使用 sbt 0.13.5 和 sbt-assembly 0.11.2,这里是一个多模块项目。如果你在 root 下运行assembly,只会将“app”项目制作成一个胖 jar。

      project/Build.scala

      import sbt._
      import Keys._
      import sbtassembly.Plugin.assemblySettings
      
      object MyApp extends Build {
      
        lazy val root = Project("root", file(".")).aggregate(common, app)
      
        lazy val common = Project("common", file("common"))
      
        lazy val app = Project("app", file("app")).settings(assemblySettings: _*).dependsOn(common)
      
      }
      

      common/src/main/scala/com/example/common/Hello.scala

      package com.example.common
      
      object Hello {
        def hello(name: String): String = s"Hello, $name"
      }
      

      app/src/main/scala/com/example/hello/App.scala

      package com.example.hello
      
      import com.example.common.Hello._
      
      object Main extends App {
        println(hello(args(0)))
      }
      

      【讨论】:

      • 但它是一个自动插件,所以我不会将程序集设置添加到任何项目中。
      • 我也想知道,基本上 root/assembly 解决了为所有子模块创建单独的 jar 包,而不是一个包含所有子项目依赖项的根 jar 包。
      • 它基本上强制执行构建定义中存在的每个项目的程序集设置。有一个设置assembleArtifact := false,但它似乎没有任何效果。它仍在组装项目。
      • 您可以使用(someProject).disablePlugins(sbtassembly.AssemblyPlugin)禁用插件
      • @tobym 您的最后一条评论可能比您的原始答案更好地回答了这个问题,您可能希望将其作为第一个选项包含在主要答案中。无论如何,这对我很有帮助,谢谢!
      【解决方案3】:

      实际上,sbt 设置确实可以工作,但是您必须阅读代码才能找到正确的使用方法。我能够通过设置完成你想要的:

      assembleArtifact in packageBin := false,
      assembleArtifact in assemblyPackageScala := false,
      assembleArtifact in assemblyPackageDependency := false,
      

      【讨论】:

        猜你喜欢
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 2019-07-28
        • 2016-06-03
        • 2017-02-28
        • 1970-01-01
        相关资源
        最近更新 更多