I am going to create resources based on sbt templates and settings. There should be different sbt settings for Compile and Test . The templates are in project/resources/hdfs/*.xml . From the sbt-dev gitter chat, I had a recommendation to use Setting and inConfig , but I could not get it to work.
Code so far:
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))
Errors:
[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]
The next iteration, I do not know how to get hdfsNameNode in the Compile / Test instead of unregistered.
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 )
Current (ugly) solution:
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 )
scala sbt
Reactormonk
source share