我使用 SBT 0.13

我有一个在 externalIvyFile(Def.setting(baseDirectory.value / "custom-name.xml")) 中使用 build.sbt 的外部 Ivy 文件。

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

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

最佳答案

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

  • 将您的 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 并创建一个自定义的 ivy.xml,其中填充了来自 project.properties 的值

    现在只需将 ivy.xml 添加到 .gitignore 即可。

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

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

    关于sbt - 用 SBT 0.13 中的 project.properties 替换 externalIvyFile 中的属性占位符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22186495/

    10-16 02:50