我使用SBT 0.13 。
我在externalIvyFile(Def.setting(baseDirectory.value / "custom-name.xml"))
中使用build.sbt
创建了一个外部常春藤文件。
在ivy.xml
中,${branch}
形式的属性占位符。这些属性的值来自project.properties
。
如何告诉sbt使用我的project.properties
填充占位符?
答案 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。