gpt4 book ai didi

scala - SBT - 使用汇编时的多项目合并策略和构建 sbt 结构

转载 作者:行者123 更新时间:2023-12-03 10:30:15 25 4
gpt4 key购买 nike

我有一个项目,它由多个较小的项目组成,其中一些相互依赖,例如,有一个实用程序项目依赖于 commons 项目。
其他项目可能依赖也可能不依赖公用事业或公用事业,或者两者都不依赖。

在 build.sbt 中,我在文件末尾有程序集合并策略,以及程序集中的测试是 {}。

我的问题是:这是正确的吗,每个项目都应该有自己的合并策略吗?如果是,其他依赖它的项目会从他们那里继承这个策略吗?将合并策略包含在所有项目定义中似乎很笨拙,并且意味着大量重复的代码。

这个问题也适用于测试,每个项目是否应该有是否应该执行测试的界限,或者是否也将被继承?

提前致谢。如果有人知道指向一个明智(相对复杂)示例的链接,那也很棒。

最佳答案

在我的日常工作中,我目前从事一个大型的多项目。不幸的是它的源代码是封闭的,所以我不能分享细节,但我可以分享一些指导。

  • 创建 rootSettings仅由根/容器项目使用,因为它通常不是程序集或发布步骤的一部分。它将包含以下内容:
    lazy val rootSettings := Seq(
    publishArtifact := false,
    publishArtifact in Test := false
    )
  • 创建 commonSettings由所有子项目共享。将基础/共享程序集设置放在此处:
    lazy val commonSettings := Seq(

    // We use a common directory for all of the artifacts
    assemblyOutputPath in assembly := baseDirectory.value /
    "assembly" / (name.value + "-" + version.value + ".jar"),

    // This is really a one-time, global setting if all projects
    // use the same folder, but should be here if modified for
    // per-project paths.
    cleanFiles <+= baseDirectory { base => base / "assembly" },

    test in assembly := {},

    assemblyMergeStrategy in assembly := {
    case "BUILD" => MergeStrategy.discard
    case "logback.xml" => MergeStrategy.first
    case other: Any => MergeStrategy.defaultMergeStrategy(other)
    },

    assemblyExcludedJars in assembly := {
    val cp = (fullClasspath in assembly).value
    cp filter { _.data.getName.matches(".*finatra-scalap-compiler-deps.*") }
    }
    )
  • 每个子项目使用commonSettings ,并应用项目特定的覆盖:
    lazy val fubar = project.in(file("fubar-folder-name"))
    .settings(commonSettings: _*)
    .settings(
    // Project-specific settings here.
    assemblyMergeStrategy in assembly := {
    // The fubar-specific strategy
    case "fubar.txt" => MergeStrategy.discard
    case other: Any =>
    // Apply inherited "common" strategy
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(other)
    }
    )
    .dependsOn(
    yourCoreProject,
    // ...
    )
  • 顺便说一句,如果使用 IntelliJ。不要命名你的根项目变量root ,因为这是在最近项目菜单中显示的项目名称。
    lazy val myProjectRoot = project.in(file("."))
    .settings(rootSettings: _*)
    .settings(
    // ...
    )
    .dependsOn(
    // ...
    )
    .aggregate(
    fubar,
    // ...
    )

  • 您可能还需要添加自定义策略来组合 reference.conf文件(用于 Typesafe Config 库):
    val reverseConcat: sbtassembly.MergeStrategy = new sbtassembly.MergeStrategy {
    val name = "reverseConcat"
    def apply(tempDir: File, path: String, files: Seq[File]): Either[String, Seq[(File, String)]] =
    MergeStrategy.concat(tempDir, path, files.reverse)
    }

    assemblyMergeStrategy in assembly := {
    case "reference.conf" => reverseConcat
    case other => MergeStrategy.defaultMergeStrategy(other)
    }

    关于scala - SBT - 使用汇编时的多项目合并策略和构建 sbt 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39371112/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com