用SBT 0.13中的project.properties替换externalIvyFile中的属性占位符?

时间:2014-03-05 01:06:13

标签: sbt ivy

我使用SBT 0.13

我在externalIvyFile(Def.setting(baseDirectory.value / "custom-name.xml"))中使用build.sbt创建了一个外部常春藤文件。

ivy.xml中,${branch}形式的属性占位符。这些属性的值来自project.properties

如何告诉sbt使用我的project.properties填充占位符?

2 个答案:

答案 0 :(得分:3)

这是一个可能的解决方案:

  • 将您的ivy.xml重命名为ivy.xml.template

  • ixy.xml.template和project.properties必须位于基础文件夹中

  • 将此添加到文件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,并创建一个使用project.properties中的值填充的自定义ivy.xml

现在只需将ivy.xml添加到.gitignore就可以了。

唯一要记住的是,无论何时修改project.properties,都必须在sbt控制台上调用reload(或重新启动sbt)

您可以将其展开以适用于其他文件,但我会将其作为练习留给您。

答案 1 :(得分:0)

为避免代码重复,我为此创建了一个SBT插件:https://github.com/matthieus/sbt-ivy

由于存在一些硬编码值,所以非常鼓励使用Fork。