Creating resources for compilation and testing

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 ) 
+7
scala sbt
source share
1 answer

Just pass the configuration as an argument when defining a resource generator.

 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 ) 

Don't want to specify an area twice? Just refactoring a bit more.

 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) ) 
+6
source share

All Articles