使用 FAKE 操作 XML 文件

Manipulate an XML file with FAKE

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

我想在 FAKE 的帮助下构建一个 Windows Phone 8.1 项目。版本标签是构建脚本的一个参数。标签已经嵌入到装配信息中:

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"

我在 FAKE (http://fsharp.github.io/FAKE/apidocs/fake-xmlhelper.html) 的文档中找到了一个 XMLHelper,看起来这个东西可以完成这项工作。但是没有例子。我不知道该怎么做。

您可以使用 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