使用 sbt 程序集重命名文件



我有一个使用ConfigFactory来设置应用程序配置的scala项目。对于建筑,我使用sbt(与sbt-assembly一起)。

根据我是使用 sbt-assembly 创建程序集还是只是运行项目,我想使用不同的配置文件(application.conf运行项目时,assembly.conf运行项目程序集时

)。

我想使用assemblyMergeStrategy来实现这个目的:组装罐子时,我会丢弃application.conf并重命名assembly.conf。我的想法是这样的:

assemblyMergeStrategy in assembly := {
  case PathList("application.conf") => MergeStrategy.discard
  case PathList("assembly.conf") => MergeStrategy.rename
  ...
}

通过这一点,我想实现的是,在组装jar时,文件assembly.conf被重命名为application.conf,因此被ConfigFactory使用,而原始application.conf被丢弃。

上面的代码显然不起作用,因为我无法指定assembly.conf应该重命名为哪个文件名。我怎样才能做到这一点?

您需要定义自己的 MergeStrategy(在project目录中),它将文件重命名为 application.conf,然后重新定义assemblyMergeStrategy in assembly以丢弃原始application.conf并将MyMergeStrategy应用于assembly.conf

import java.io.File   
import sbtassembly.MergeStrategy
class MyMergeStrategy extends MergeStrategy{
  override def name: String = "Rename to application.conf"
  override def apply(tempDir: File, path: String, files: Seq[File]): Either[String, Seq[(File, String)]] = {
    Right(files.map(_ -> "application.conf"))
  }
}

然后在build.sbt中使用:

val root = (project in file(".")).settings(Seq(
  assemblyMergeStrategy in assembly := {
    case PathList("application.conf") => MergeStrategy.discard
    case PathList("assembly.conf") => new MyMergeStrategy()
    case x =>
      val oldStrategy = (assemblyMergeStrategy in assembly).value
      oldStrategy(x)
  }
))

这仅适用于您的情况,但对于更复杂的情况,我会阅读它们如何在 sbt-native-packager 中做到这一点:https://www.scala-sbt.org/sbt-native-packager/recipes/package_configuration.html

最新更新