gpt4 book ai didi

sbt - 使用 sbt-assembly 重命名文件

转载 作者:行者123 更新时间:2023-12-04 16:46:24 27 4
gpt4 key购买 nike

我有一个 scala 项目,它使用 ConfigFactory 来设置应用程序配置。对于构建,我使用 sbt(连同 sbt-assembly)。

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

为此,我想到了使用 assemblyMergeStrategy:在组装 jar 时,我会丢弃 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丢弃原始 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

关于sbt - 使用 sbt-assembly 重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058600/

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