我使用 SBT 0.13 。
我有一个在 externalIvyFile(Def.setting(baseDirectory.value / "custom-name.xml"))
中使用 build.sbt
的外部 Ivy 文件。
在 ivy.xml
中有 ${branch}
形式的属性占位符。这些属性的值来自 project.properties
。
我如何告诉 sbt 使用我的 project.properties
来填充占位符?
最佳答案
这是一个可能的解决方案:
.
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/