问题:如何使用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,看起来这个东西可以完成这项工作。但没有例子。我无法弄明白该怎么做。
答案 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