Обновление XML-файла (vsixmanifest)

Я создаю пакет Visual Studio 2013 (vsix) (бесстыдный плагин: pMixins). В рамках моего стремления использовать TeamCity в качестве сервера непрерывной интеграции я настроил Team City для создания пакета.vsix (пакет Visual Studio (vsix) - Team City без установленной Visual Studio).

Теперь я хочу настроить Team City для установки версии в схеме VSIX:

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest 
    Version="2.0.0" 
    xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" 
    xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
    <Metadata>
        <Identity  Version="1.0" Language="en-US" Publisher="Company" />

Следуя совету в разделе Использование msbuild, я хочу обновить файл конфигурации значениями из teamcity и Как мне обновить атрибут XML из скрипта MSBuild? Я обновил Microsoft.VsSDK.targetsиспользовать XmlPoke со следующей целью:

<Target 
     Name="UpdateVSIXVersion" 
     BeforeTargets="PrepareForBuild" 
     Condition="$(VSIXVersion) != '' And $(VSIXVersion) != '*Undefined*'">

    <Message Text= "Updating VSIX Version" />

    <XmlPoke 
        XmlInputPath="source.extension.vsixmanifest"
        Query="/PackageManifest/Metadata/Identity/@Version"
        Value="$(VSIXVersion)">         
    </XmlPoke>      
 </Target>

Я обновил Team City системным параметром, чтобы установить VSIXVersion:

Снимок экрана: параметры системы Team City

Но когда я проверял TeamCity, он сделал 0 замен:

Team City Build Log

Как заставить Team City корректно обновить XML-файл.vsixmanifest?

1 ответ

Решение

После долгих поисков я наконец обнаружил, что XmlPoke ожидает namespace когда файл Xml содержит пространство имен, даже для пространства имен по умолчанию ( изменение файла.config в проекте MSBuild).

Однако я не смог найти никакой документации для XmlPoke.Namespaces параметр и приведенный выше код не работает. После долгих пробных ошибок я наконец-то понял, что нужно работать с этим:

<Target 
    Name="UpdateVSIXVersion" 
    BeforeTargets="PrepareForBuild" 
    Condition="$(VSIXVersion) != '' And $(VSIXVersion) != '*Undefined*'">

    <Message Text= "Updating VSIX Version" />

    <XmlPoke 
        XmlInputPath="source.extension.vsixmanifest"
        Query="/n:PackageManifest/n:Metadata/n:Identity/@Version"
        Value="$(VSIXVersion)"
        Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/vsx-schema/2011' Name='DoNotKnowWhatThisIsFor-ButItIsRequired' /&gt;">
    </XmlPoke>      

Заметки:

  • Для этого необходимо настроить MSBuild 12 в Team City
  • Пространства имен должны быть экранированы.
  • Параметр Name является обязательным, иначе MSBuild выдаст ошибку
  • Исходный запрос XPath должен был быть обновлен искусственным префиксом пространства имен.

Файл MSBuild находится на Github, если он кому-то нужен: https://github.com/ppittle/pMixins/blob/master/tools/vssdk_tools/v12.0/VSSDK/Microsoft.VsSDK.targets

Другие вопросы по тегам