gpt4 book ai didi

scala - 生成用于编译和测试的资源

转载 作者:行者123 更新时间:2023-12-02 14:19:33 25 4
gpt4 key购买 nike

我打算根据模板和 sbt 设置生成资源。 CompileTest 应该有不同的 sbt 设置。模板位于 project/resources/hdfs/*.xml 中。从 sbt-dev gitter 聊天中,我建议使用 SettinginConfig,但我无法让它工作。

到目前为止的代码:

val hdfsNamenode = settingKey[String]("Namenode for the HDFS access")

def genHdfsConfigs: Setting[_] =
hdfsNamenode := {
resourceGenerators += Def.task {
val files = ((baseDirectory.value / "project" / "resources" / "hdfs" ) * "*.xml").get
files.foreach({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", hdfsNamenode.value)
IO.write(resourceManaged.value / hdfsTemplate.getName, config)
})
files.toSeq
}.taskValue
}

hdfsNamenode in Test := "localhost"
hdfsNamenode in Compile := "172.31.32.228"

def allHdfsNamenodeConfigs: Seq[Setting[_]] =
inConfig(Compile)(Seq(hdfsNamenode)) ++ inConfig(Test)(Seq(hdfsNamenode))

错误:

[error]  found   : sbt.Def.Setting[Seq[sbt.Task[Seq[java.io.File]]]]
[error] required: String
[error] resourceGenerators += Def.task {
[error] ^

[error] found : sbt.SettingKey[String]
[error] required: sbt.Def.Setting[_]
[error] inConfig(Compile)(Seq(hdfsNamenode)) ++ inConfig(Test)(Seq(hdfsNamenode))
[error]

下一次迭代,我不知道如何在Compile/Test范围内获取hdfsNameNode而不是无范围的。

lazy val hdfsNameNode = settingKey[String]("Namenode for the HDFS access")

val genHdfsConfig = Def.task {
val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
files.map({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", hdfsNameNode.value)
val outputPath = resourceManaged.value / hdfsTemplate.getName
IO.write(outputPath, config)
outputPath
})
}

Seq(
hdfsNameNode := "undefined", // Only this one is accepted
hdfsNameNode in Test := "localhost",
hdfsNameNode in Compile := "172.31.32.228",
resourceGenerators in Compile += genHdfsConfig.taskValue,
resourceGenerators in Test += genHdfsConfig.taskValue
)

当前(丑陋)的解决方案:

val hdfsTestNameNode = "localhost"
val hdfsMainNameNode = "172.31.32.228"

val hdfsNameNode = settingKey[String]("Namenode for the HDFS access")

val genTestHdfsConfig = Def.task {
val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
files.map({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in Test).value)
val outputPath = resourceManaged.value / hdfsTemplate.getName
IO.write(outputPath, config)
outputPath
})
}

val genCompileHdfsConfig = Def.task {
val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
files.map({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in Compile).value)
val outputPath = resourceManaged.value / hdfsTemplate.getName
IO.write(outputPath, config)
outputPath
})
}

Seq(
hdfsNameNode in Test := hdfsTestNameNode,
hdfsNameNode in Compile := hdfsMainNameNode,
resourceGenerators in Compile += genCompileHdfsConfig.taskValue,
resourceGenerators in Test += genTestHdfsConfig.taskValue
)

最佳答案

在定义资源生成器时只需将配置作为参数传递即可。

val hdfsTestNameNode = "localhost"
val hdfsMainNameNode = "172.31.32.228"

val hdfsNameNode = settingKey[String]("Namenode for the HDFS access")

def genHdfsConfig(cfg: Configuration) = Def.task {
val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
files.map({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in cfg).value)
val outputPath = (resourceManaged in cfg).value / hdfsTemplate.getName
IO.write(outputPath, config)
outputPath
})
}

Seq(
hdfsNameNode in Test := hdfsTestNameNode,
hdfsNameNode in Compile := hdfsMainNameNode,
resourceGenerators in Compile += genHdfsConfig(Compile).taskValue,
resourceGenerators in Test += genHdfsConfig(Test).taskValue
)

不想指定两次范围?只需重构一点即可。

val hdfsTestNameNode = "localhost"
val hdfsMainNameNode = "172.31.32.228"

val hdfsNameNode = settingKey[String]("Namenode for the HDFS access")

def addHdfsConfigGenerator(cfg: Configuration) = {
inConfig(cfg) {
val hdfsConfigGenerator = Def.task {
val files = ((baseDirectory.value / "project" / "templates" / "resources" / "hdfs" ) * "*.xml").get
files.map({ hdfsTemplate =>
val config = IO.read(hdfsTemplate).replace("{{namenode}}", (hdfsNameNode in cfg).value)
val outputPath = (resourceManaged in cfg).value / hdfsTemplate.getName
IO.write(outputPath, config)
outputPath
})
}
resourceGenerators += hdfsConfigGenerator.taskValue
} last
}

Seq(
hdfsNameNode in Test := hdfsTestNameNode,
hdfsNameNode in Compile := hdfsMainNameNode,
addHdfsConfigGenerator(Compile),
addHdfsConfigGenerator(Test)
)

关于scala - 生成用于编译和测试的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31908485/

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