2016-03-23 2 views
3

Вопрос: Как установить определенный атрибут в файле XML с помощью FAKE?Управление файлом XML с помощью FAKE

Я хочу создать проект Windows Phone 8.1 с помощью FAKE. Тег версии является параметром скрипта сборки. Тег уже запеченные в 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> 

Я хочу изменить значение атрибута Version тега Identity. Он должен содержать тег версии, указанный как параметр сборки. Я хочу сделать это в отдельной мишени с именем «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 может использоваться для изменения элемента в XML-файле, ссылаясь на него с выражением XPath. Файл 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 
Смежные вопросы