2016-03-23 48 views
3

问题:如何使用FAKE在XML文件中设置特定属性?使用FAKE处理XML文件

我想在FAKE的帮助下构建一个Windows Phone 8.1项目。版本标记是构建脚本的参数。标签已经被烤成assemply信息:

let version = getBuildParamOrDefault "version" "0.0.0.1" 

Target "AssemblyInfo" (fun _ -> 
    CreateCSharpAssemblyInfo "./src/SharedAssemblyInfo.cs" 
     [ 
      Attribute.Product  product 
      Attribute.Version  version 
      Attribute.FileVersion version 
      Attribute.Metadata ("githash", commitHash) 
     ] 
) 

有在包含版本信息了Windows Phone 8.1的项目的另一个文件:Package.appxmanifest。

<?xml version="1.0" encoding="utf-8"?> 
<Package ...> 

    <Identity Name="..." Publisher="..." Version="1.0.0.0" /> 

    ... 

</Package> 

我想更改Identity标签的Version属性的值。它应该包含作为构建参数给出的版本标记。我想这样做在名为“AppxManifest”一个单独的目标,它应该操纵程序集信息文件后执行,但在执行前的MSBuild编译:

Target "AppxManifest" (fun _ -> 

    ??? 

) 

"Clean" 
==> "RestorePackages" 
==> "AssemblyInfo" 
==> "AppxManifest" 
==> "Build" 

我发现了一个XMLHelper FAKE的文档中(http://fsharp.github.io/FAKE/apidocs/fake-xmlhelper.html),看起来这个东西可以完成这项工作。但没有例子。我无法弄清楚如何去做。

回答

2

您可以使用XMLHelper库来操作XML文件。函数XmlPoke可用于通过使用XPath表达式引用它来更改XML文件中的元素。 Package.appxmanifest文件包含名称空间,因此您必须采用可正确处理名称空间的姐妹函数XmlPokeNS。

最后一个难题是Package.appxmanifest中的默认名称空间。您必须指定与默认名称空间相关联的前缀。在您的XPath表达式中,此前缀用于引用XML元素。

没有特殊的前缀字符串,你可以选择任何你想要的。在这个例子中,我选择前缀“df”:

open Fake.XMLHelper 

Target "PackageAppxmanifest" <| fun _ -> 
    let file = "<path to Package.appxmanifest>" 
    let ns = [ "df", "http://schemas.microsoft.com/appx/2010/manifest" ] 
    let xpath = @"df:Package/df:Identity/@Version" 
    XmlPokeNS file ns xpath version