xpath - 更新 Xml 文件 (vsixmanifest)

标签 xpath msbuild teamcity vsix vsixmanifest

我正在创建一个 Visual Studio 2013 包 (vsix)(无耻插件:pMixins)。作为我使用 TeamCity 的一部分作为持续集成服务器,我已配置 Team City 来构建 .vsix 包 (Visual Studio Package (vsix) - Team City without Visual Studio installed)。

现在我想配置 Team City 以在 VSIX Schema 中设置版本:

<?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" />

遵循 Using msbuild I want to update a config file with values from teamcity 中的建议和 How do I update an XML attribute from an MSBuild script?我更新了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 :

Screen shot of Team City System Parameters

但是,当我检查 TeamCity 时,它进行了 0 次替换:

Team City Build Log

如何让 Team City 正确更新 .vsixmanifest xml?

最佳答案

经过大量搜索,我终于发现 XmlPoke 需要 namespace当 Xml 文件包含命名空间时,即使对于默认命名空间 ( Modifying .config File in an MSBuild Project )。

但是,我找不到 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>      

备注:
  • 这需要在 Team City
  • 上配置 MSBuild 12
  • 命名空间需要转义。
  • Name 参数是必需的,否则 MSBuild 会报错
  • 必须使用人工命名空间前缀来更新原始 XPath 查询。

  • 如果有人需要,MSBuild 文件在 Github 上:https://github.com/ppittle/pMixins/blob/master/tools/vssdk_tools/v12.0/VSSDK/Microsoft.VsSDK.targets

    关于xpath - 更新 Xml 文件 (vsixmanifest),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328738/

    相关文章:

    python - Scrapy>索引错误: list index out of range

    msbuild - 如何通过命令行将链接器选项传递给msbuild?

    msbuild - 如何让 xUnit runner 只在特定类中执行测试?

    .net - TeamCity - MSBuild 运行程序退出时代码不为零

    c# - 有关如何在 C# 中从 XML 文档中正确提取 DateTime 的一些信息?

    java - xpath 只返回一个结果

    r - XPath 选择和连接所有文本节点

    deployment - 是否要部署到多台服务器的TFS2010构建定义?

    git - 设置 TeamCity 以 pull 多个具有命名位置的 git repos

    docker - Teamcity-未满足要求:docker.server.osType包含Windows