加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:19:03 所属栏目:安全 来源:网络整理
导读:我有一个由多个较小的项目组成的项目,其中一些项目彼此依赖,例如,有一个依赖于commons项目的实用程序项目. 其他项目可能会也可能不会依赖于公用事业或公共场所或两者都不依赖. 在build.sbt中,我在文件末尾有汇编合并策略,而汇编中的测试是{}. 我的问题是:这
我有一个由多个较小的项目组成的项目,其中一些项目彼此依赖,例如,有一个依赖于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,// ...
  )

> BTW,如果使用IntelliJ.不要命名根项目变量root,因为这是最近项目菜单中显示为项目名称的内容.

lazy val myProjectRoot = project.in(file("."))
  .settings(rootSettings: _*)
  .settings(
    // ...
  )
  .dependsOn(
    // ...
  )
  .aggregate(
    fubar,// ...
  )

您可能还需要添加自定义策略来组合reference.conf文件(对于Typesafe配置库):

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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读