Replacing property placeholders in externalIvyFile with project.properties in SBT 0.13?

I am using SBT 0.13 .

I have an external Ivy file using externalIvyFile(Def.setting(baseDirectory.value / "custom-name.xml"))in build.sbt.

There ivy.xmlare placeholders for properties in the form ${branch}. The values ​​for these properties are taken from project.properties.

How to tell sbt to use mine project.propertiesto fill in placeholders?

+4
source share
2 answers

Here is a possible solution:

  • rename your ivy.xml to ivy.xml.template

  • ixy.xml.template and project.properties should be in the base folder

  • Add this to base_folder / project / project / build.scala

.

import java.io.FileInputStream
import java.util.Properties
import scala.collection.JavaConversions._
import sbt._
import Keys._

object build extends Build {
  def readProperties(filename: String): Map[String, String] = {
    try {
      val prop = new Properties()
      prop.load(new FileInputStream(filename))
      prop.stringPropertyNames().map( k => (k,prop.getProperty(k))).toMap
    } catch {
      case e: Exception =>
        e.printStackTrace()
        Map()
    }
  }

  def processIvyXml(base: File): Seq[File] = {
    val properties = readProperties((base/"../project.properties").getAbsolutePath)
    val ivyXml: String = sbt.IO.read(base/"../ivy.xml.template")
    val result = properties.keys.foldLeft(ivyXml){
      (tmpXml,key) => tmpXml.replaceAll( "\\$\\{"+key+"\\}" , properties(key))
    }
    sbt.IO.write(base/"../ivy.xml",result)
    Seq()
  }

  lazy val root = project.in(file(".")).settings(
    resourceGenerators in Compile <+= (baseDirectory in Compile) map { base =>
      processIvyXml(base)
    }
  )
}

project.properties ivy.xml.template ivy.xml, project.properties

ivy.xml .gitignore .

, , , , project.properties, sbt ( sbt)

, , .

+3

Source: https://habr.com/ru/post/1530147/


All Articles