我尝试从基于Groovy的构建脚本中解析项目版本信息,该脚本来自版本定义为.wxs
宏的三方WIX
项目文件:
<?define ProductVersion = '5.0.00' ?>
...
<Product Name="My Product" Version='$(var.ProductVersion)' .... >
...
显然,这样的伎俩:
def productVersion = new XmlSlurper().parse(wxsFile).Product.first().attributes().Version
只会返回$(var.ProductVersion)
。
是否有可以预处理WIX XML代码以扩展宏的Groovy / Java解析器?
或者,也许,有一种方法可以遍历<?define>
部分(作为一种解决方法,这样做)?
答案 0 :(得分:0)
我无法代表Groovy / Java,但在C#Linq到XML世界中,我得到的是XProcessingInstruction的后代节点,并寻找在ProductVersion上匹配的节点。
但是在WiX中,预处理器变量也可以传递到构建中或者分解到其他源中。例如,在Team Foundation Server构建中,TFS设置一个名为TF_BUILD_NUMBER的环境变量。在我的MSBuild(.wixproj)中,我对此进行RegEx匹配并将其分配给msbuild属性。然后我将属性分配给预处理器变量,最后我在你看到的Product元素中使用变量。
所以我想在我能给你更具体的指导之前,我想知道你在做什么。然后,如何在Groovy / Java中实现它是我的经验之外的。我确定它与我们在C#中所做的类似。
答案 1 :(得分:0)
这不是一个完整的解决方案,但如果你找不到更好的解决方案,你应该提供一个提示。
解析声明
import groovy.util.Eval
def var = [:]
// <?define ProductVersion = '5.0.00' ?>
// for each define transform to this assignment ...
var.ProductVersion = '5.0.00'
解析属性
像往常一样解析,但替换为卷曲括号并将可变名称设置为 x
def wxsFile = '<Product Name="My Product" Version="$(var.ProductVersion)" />'
def productVersion = new XmlSlurper().parseText(wxsFile).first().attributes().Version.replaceAll(/\(var\./, "{x.").replaceAll(/\)/, "}")
这给出了一个字符串 $ {x.ProductVersion}
<强>评估强>
使用 Eval.x ,您可以传递daclaration变量(在 var hashmap中定义)并评估引用这些变量的字符串。可变名称 x 是硬编码的,这是重命名的原因。
def expr = "return \"${productVersion}\""
println expr
// return "${x.ProductVersion}"
println Eval.x(var, expr)
// 5.0.00