使用FAKE

时间:2016-03-23 10:48:25

标签: f# windows-phone-8.1 f#-fake

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

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

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属性的值。它应该包含作为构建参数给出的版本标记。我想在一个名为&#34; AppxManifest&#34;的单独目标中进行此操作。它应该在操作程序集信息文件之后但在执行MSBuild构建之前执行:

Target "AppxManifest" (fun _ ->

    ???

)

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

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

1 个答案:

答案 0 :(得分: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